【打卡】牛客网:

自己写的:

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

【打卡】牛客网:_第1张图片

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param num int整型vector 
     * @return int整型vector>
     */
    
    vector > ans;
    vector flag;
    void dfs(vectornum, int index, vectorans_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 > permute(vector& num) {
        // write code here
        for(int i = 0; i < num.size(); i++)
            flag.push_back(0);
            
        vector 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 > ans;
    vector flag;
    void dfs(vectornum, vectorans_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 > permute(vector& num) {
        // write code here
        for(int i = 0; i < num.size(); i++)
            flag.push_back(0);
            
        vector ans_single;

        dfs(num, ans_single);

        return ans;
    }
};

 

模板的:

没有全局变量。

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

【打卡】牛客网:_第2张图片

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param num int整型vector 
     * @return int整型vector>
     */
    
    void dfs(vector> &res, vector &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 > permute(vector& num) {
        // write code here
        vector > res;
        // sort(num.begin(),num.end());
        dfs(res,num,0);
        return res;
    }
};

你可能感兴趣的:(算法,深度优先)