• 代码随想录算法训练营第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

  • 相关阅读:
    六爻排盘神机
    古记事法:Windows 下 16 位汇编环境搭建指南(DOSBox-X 篇)
    LoRaWan协议解析
    Spring Boot 配置文件
    java系列之 页面打印出 [object Object],[object Object]
    EasyRecovery2023重新找回丢失的文件数据恢复软件
    CogView中的Transformer
    代码随想录算法训练营第三十五天丨 贪心算法part06
    解决kubernetes node节点flannel网卡始终不能添加成功的问题
    2022 LGR 非专业级别软件能力认证第一轮 (SCP-S) 提高级 C++语言模拟试题
  • 原文地址:https://blog.csdn.net/qq_43750923/article/details/136263311