代码随想录二刷Day 31

46.全排列

这个题就不用startindex每次从那个数之后选择了,每次都是从最开始选择, 但是每次for循环选过的数字还是要删掉,所以加了下面这句删除

 if(used[i] == true) //所以这个垂直方向已经取过得数字也会进去for循环,但是会被直接跳过去;这样的话就不需要startindex,i可以从0开始,然后每次可以通过这个used把已经遍过得数字给人为的去掉;
            {continue;}
class Solution {
public:
    vector<vector<int>> result;
    vector<int> path;

    void backtracking(vector<int>&nums, vector<bool>&used){
        if(path.size() == nums.size()){
            result.push_back(path);
            return;
        }

        for(int i=0;i<nums.size();i++){

            if(used[i] == true) //所以这个垂直方向已经取过得数字也会进去for循环,但是会被直接跳过去;这样的话就不需要startindex,i可以从0开始,然后每次可以通过这个used把已经遍过得数字给人为的去掉;
            {continue;}
        
                path.push_back(nums[i]);
                used[i] =true;
                backtracking(nums,used);
                path.pop_back();
                used[i] =false;
            
        }
    }

    vector<vector<int>> permute(vector<int>& nums) {
        vector<bool> used(nums.size(), false);
        backtracking(nums,used);
        return result;
    }
};

47.全排列 II

这个题也是前面那个题和树层去重的缝合问题;used数组又要和上面那个题一样用来去掉本层已经选过的元素,又要用来排除重复的组合

class Solution {
public:
    
    vector<vector<int>> result;
    vector<int> path;

   void backtracking(vector<int>& nums, vector<bool>&used){
        if(path.size() == nums.size()){
            result.push_back(path);
            return;
        }

         for(int i=0;i<nums.size();i++){

            if(i > 0 && nums[i] == nums[i - 1] && used[i - 1] == false) //因为操作了i-1所以要确保i>0
            {continue;}

            if(used[i] == false){
                path.push_back(nums[i]);
                used[i] =true;
                backtracking(nums,used);
                path.pop_back();
                used[i] =false;
            } 
        }
    }

    vector<vector<int>> permuteUnique(vector<int>& nums) {
        vector<bool> used(nums.size(),false);
        sort(nums.begin(), nums.end());
        backtracking(nums,used);
        return result;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值