【打卡】牛客网:

news/2024/7/20 22:05:31 标签: 算法, 深度优先

自己写的:

虽然题目要求了排序,但是我没排序也可以通过。

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param num int整型vector 
     * @return int整型vector<vector<>>
     */
    
    vector<vector<int> > ans;
    vector<int> flag;
    void dfs(vector<int>num, int index, vector<int>ans_single){
        ans_single.push_back(num[index]);

        if(ans_single.size() == num.size()){
            ans.push_back(ans_single);
            return;
        }

        flag[index] = 1;
        for(int i = 0; i < num.size(); i ++){
            if(flag[i] != 1) // 没有被访问过
                dfs(num, i, ans_single);
        }
        flag[index] = 0;
    }

    vector<vector<int> > permute(vector<int>& num) {
        // write code here
        for(int i = 0; i < num.size(); i++)
            flag.push_back(0);
            
        vector<int> ans_single;
        for(int i = 0; i < num.size(); i++)  // 直接dfs(num, 0, ans_single)会只递归1开头的树,不递归2开头的和3开头的。
            dfs(num, i, ans_single);

        return ans;
    }
};

为了主函数直接调用,优化了一下:

  • 之前的dfs的参数是2个。回溯的时候,flag回溯。
  • 现在的dfs的参数是2个。回溯的时候,flag和ans_single都要回溯。
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param num int整型vector 
     * @return int整型vector<vector<>>
     */
    
    vector<vector<int> > ans;
    vector<int> flag;
    void dfs(vector<int>num, vector<int>ans_single){
        if(ans_single.size() == num.size()){
            ans.push_back(ans_single);
            return;
        }
        
        for(int i = 0; i < num.size(); i ++){
            if(flag[i] != 1) { // 没有被访问过  
                flag[i] = 1; //放在for循环的里面
                ans_single.push_back(num[i]);
                dfs(num, ans_single);
                ans_single.pop_back(); //调试很久,忘记回溯
                flag[i] = 0; //回溯
            }     
        }
        
    }

    vector<vector<int> > permute(vector<int>& num) {
        // write code here
        for(int i = 0; i < num.size(); i++)
            flag.push_back(0);
            
        vector<int> ans_single;

        dfs(num, ans_single);

        return ans;
    }
};

 

模板的:

没有全局变量。

我的有,需要全局变量记录是否访问过。

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param num int整型vector 
     * @return int整型vector<vector<>>
     */
    
    void dfs(vector<vector<int>> &res, vector<int> &num, int index){
        if(index == num.size()-1){
            res.push_back(num);
            return;
        }


        for(int i = index; i < num.size(); i++){
            swap(num[index],num[i]); 
            dfs(res, num, index+1);
            swap(num[index],num[i]); //回溯
        }

    }

    vector<vector<int> > permute(vector<int>& num) {
        // write code here
        vector<vector<int> > res;
        // sort(num.begin(),num.end());
        dfs(res,num,0);
        return res;
    }
};


http://www.niftyadmin.cn/n/5187215.html

相关文章

汽车CAN/ CAN FD数据记录仪在上汽大通诊断测试部门的应用

CAN/CANFD数据诊断记录仪在 规格&#xff1a;数据记录诊断仪 功能&#xff1a;CAN(FD)数据记录 UDS诊断 WIFI收发报文

Win通过WSL配置安装Redis

一共分为如下几步&#xff1a; 安装WSL发行版&#xff0c;如Ubuntu安装Redis配置Redis与WSL WSL安装 这里有微软官方的文档&#xff1a;https://learn.microsoft.com/zh-cn/windows/wsl/install 但我不建议零基础的这么做。很容易输完一些命令之后&#xff0c;把环境弄得乱七…

【开源】基于JAVA的智能停车场管理系统

项目编号&#xff1a; S 005 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S005&#xff0c;文末获取源码。} 项目编号&#xff1a;S005&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容A. 车主端功能B. 停车工作人员功能C. 系…

HotSpot 为什么要分为新生代和老年代?

HotSpot 虚拟机之所以将堆内存分为新生代和老年代&#xff0c;是为了更好地适应对象的生命周期特征&#xff0c;以提高垃圾回收的效率和性能。这种划分主要是为了应对以下两个方面的情况&#xff1a; 1. **对象生命周期的特征**&#xff1a; - 大多数对象在创建后很快就变得…

字母异位词分组[中等]

优质博文&#xff1a;IT-BLOG-CN 一、题目 给你一个字符串数组&#xff0c;请你将字母异位词组合在一起。可以按任意顺序返回结果列表。字母异位词是由重新排列源单词的所有字母得到的一个新单词。 示例 1: 输入: strs ["eat", "tea", "tan"…

一口气用Python写了13个小游戏(附源码)

今天给大家分享13个游戏源码&#xff0c;可以自己复现玩玩&#xff0c;研究下里面的编程逻辑&#xff0c;对学习编程&#xff08;特别是初学者&#xff09;应该会有很大帮助。 1、吃金币 源码分享&#xff1a; import os import cfg import sys import pygame import random f…

单片机FLASH下载算法的制作

环境 硬件使用正点原子STM32F407探索者V2开发板 编程环境使用MDK 下载工具使用JLINK FLASH芯片使用W25Q128 什么是下载算法 单片机FLASH的下载算法是一个FLM文件&#xff0c;FLM通过编译链接得到&#xff0c;其内部包含一系列对FLASH的操作&#xff0c;包括初始化、擦除、写…

单链表经典OJ题(四)

目录 1、链表中倒数第k个结点 2、消失的数字 3、轮转数组 4、合并两个有序数组 5、数组串联 6、序列中删除指定数字 1、链表中倒数第k个结点 链表中倒数第k个结点_牛客题霸_牛客网 (nowcoder.com) 这道题依然利用双指针法&#xff0c;具体解题思路如下&#xff1a; 1…