• 代码随想录算法训练营第29天 |第七章 回溯算法part05


    学习目标:

    • 491.递增子序列
    • 46.全排列
    • 47.全排列 II

    学习内容:

    491.递增子序列

    class Solution {
    public:
        vector<int> path;
        vector<vector<int>> result;
    
        void backtracking(vector<int>& nums, int startIndex)
        {
            if(path.size()>1)
            {
                result.push_back(path);
            }
            int used[201]={0};
            for(int i = startIndex;i<nums.size();i++)
            {
                if ((!path.empty() && nums[i] < path.back())
                        || used[nums[i] + 100] == 1) {
                        continue;
                }
                path.push_back(nums[i]);
                used[nums[i]+100]+=1;
                backtracking(nums,i+1);
                path.pop_back();
            }
        }
    
        vector<vector<int>> findSubsequences(vector<int>& nums) {
            backtracking(nums,0);
            return result;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    错误以及注意事项

    • 最开始做成了刚刚讲过的90.子集II (opens new window)。本题求自增子序列,是不能对原数组进行排序的,排完序的数组都是自增子序列了!
    • used[201] 是-100~100的限制导致的。不要算小了。

    46.全排列

    class Solution {
    public:
        vector<int> path;
        vector<vector<int>> result;
    
        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[nums[i]+10]==true){
                    continue;
                }
                path.push_back(nums[i]);
                used[nums[i]+10]=true;
                backtracking(nums,used);
                used[nums[i]+10]=false;
                path.pop_back();
            }
    
        }
    
        vector<vector<int>> permute(vector<int>& nums) {
            vector<bool> used(21,false);
            backtracking(nums,used);
            return result;
    
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    错误以及注意事项

    • -10~10 used数组应该为21

    47.全排列 II

    class Solution {
    public:
        vector<int> path;
        vector<vector<int>> result;
    
        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)
                {
                    continue;
                }
                if(used[i]==false)
                {
                    path.push_back(nums[i]);
                    used[i]=true;
                    backtracking(nums,used);
                    used[i]=false;
                    path.pop_back();
                }   
            }
        }
    
        vector<vector<int>> permuteUnique(vector<int>& nums) {
            vector<bool> used(nums.size(),false);
            sort(nums.begin(), nums.end()); // 排序
            backtracking(nums,used);
            return result;
    
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    错误以及注意事项

    • 如果要对树层中前一位去重,就用used[i - 1] == false,如果要对树枝前一位去重用used[i - 1] == true

    学习时间

    2024.2.25 18:40-19:40

  • 相关阅读:
    Linux cat命令
    Python线性代数傅里叶分析和动态系统模拟分析之一
    linux命令
    【Rust日报】2022-12-04 比较 u64 与比较字符串的性能
    紫光同创FPGA图像视频采集系统,提供2套PDS工程源码和技术支持
    贴近摄影测量 | 重建花山岩画只需两步!
    【SpingBoot拦截器】实现两个接口,配置拦截路径
    【干货】VS2017简介、编译、启动单项目和启动多项目
    【力扣每日一题】2023.10.11 奖励最顶尖的k名学生
    MySQL之MHA高可用配置及故障
  • 原文地址:https://blog.csdn.net/qq_43750923/article/details/136263311