代码随想录算法训练营第二十九天|491.递增子序列 46.全排列 47.全排列 II

491.

> path.back()就可以得到递增

不能排序了这次,这很重要。所以就不能简单地用if i > start来去重,用哈希就行。每层有自己的set,当然这里可以用vector

不需要start ≥ size来当作终止条件。事实上之前的一些题也不需要,因为大于size的start在forloop条件里弄完之后根本就不会进入forloop

这里是记录每一个path。思路和子集一样。

⚠️这里面array的写法是错的!!正确见下题!!⚠️

 46.

排列问题里used变成了需要被回溯的东西(用过的就做一个标记,传入下一个level,下一个level里会挑没用过的)

注意array declare的方法和the fact that

int sum(int array[], int size)与int sum(int * array, int size)没有本质的区别。坍塌现象。

return和continue分开,一个是同层传递,一个是树枝传递。

复制到美国版⬇️

class Solution {
public:
    vector<vector<int>> result;
    void backtracking(vector<int>& nums, vector<int>& path, int used[]){
        if(path.size() == nums.size()){
            result.push_back(path);
            return;
        }
        for(int i = 0; i < nums.size(); i++){
            if(used[nums[i] + 10] == 1){
                continue;
            }
            used[nums[i] + 10] = 1;
            path.push_back(nums[i]);
            backtracking(nums, path, used);
            path.pop_back();
            used[nums[i] + 10] = 0;
        }
    }
    vector<vector<int>> permute(vector<int>& nums) {
        int used[21] = {0};
        vector<int> path;
        backtracking(nums, path, used);
        return result;

    }
};

47.

去重需要用level used。level used记录已经在本level中用过了的数字的大小,所以里面应该是nums[i]。且因为nums[i] 可能是负数,所以要+10。level used的大小应该是nums里内容的取值范围(-10到10)。

排列需要用arm used。arm used记录第几个nums里的数字已经放到排列里了,所以里面应该是index。arm used的大小应该是nums的size。

复制到美国版⬇️

class Solution {
public:
    vector<vector<int>> result;
    void backtracking(vector<int>& nums, vector<bool>& arm_used, vector<int>& path){
        if(path.size() == nums.size()){
            result.push_back(path);
            return;
        }
        vector<bool> level_used(21, false);
        for(int i = 0; i < nums.size(); i++){
            if(level_used[nums[i] + 10] || arm_used[i] == true){
                continue;
            }
            level_used[nums[i] + 10] = true;
            arm_used[i] = true;
            path.push_back(nums[i]);
            backtracking(nums, arm_used, path);
            path.pop_back();
            arm_used[i] = false;
        }

    } 
    vector<vector<int>> permuteUnique(vector<int>& nums) {
        vector<bool> arm_used(8, false);
        vector<int> path;
        backtracking(nums, arm_used, path);
        return result;
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值