算法训练day31 LeetCode 491.46.47.

发布时间 2023-10-17 23:04:21作者: 烫烫烫汤圆

算法训练day31 LeetCode 491.46.47.

491.递增子序列

题目

491. 递增子序列 - 力扣(LeetCode)

题解

代码随想录 (programmercarl.com)

  • 递增子序列,意味着不能改变数组中元素顺序

  • class Solution
    {
    private:
        vector<vector<int>> result;
        vector<int> path;
        void backtracking(vector<int> &nums, int startIndex)
        {
            if (path.size() > 1)
            {
                result.push_back(path);
            }
    
            unordered_set<int> used;
            for (int i = startIndex; i < nums.size(); i++)
            {
                if ((!path.empty() && nums[i] < path.back()) || used.find(nums[i]) != used.end())
                {
                    continue;
                }
                used.insert(nums[i]);
                path.push_back(nums[i]);
                backtracking(nums, i + 1);
                path.pop_back();
            }
        }
    
    public:
        vector<vector<int>> findSubsequences(vector<int> &nums)
        {
            result.clear();
            path.clear();
            backtracking(nums, 0);
            return result;
        }
    };
    

46.全排列

题目

46. 全排列 - 力扣(LeetCode)

题解

代码随想录 (programmercarl.com)

  • 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)
                    continue; // path已收录,跳过
                used[i] = true;
                path.push_back(nums[i]);
                backtracking(nums, used);
                path.pop_back();
                used[i] = false;
            }
        }
        vector<vector<int>> permute(vector<int> &nums)
        {
            result.clear();
            path.clear();
            vector<bool> used(nums.size(), false);
            backtracking(nums, used);
            return result;
        }
    };
    

47.全排列 II

题目

47. 全排列 II - 力扣(LeetCode)

题解

代码随想录 (programmercarl.com)

  • class Solution
    {
    private:
        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)
                    continue;
                if (used[i] == false)
                {
                    used[i] = true;
                    path.push_back(nums[i]);
                    backtracking(nums, used);
                    path.pop_back();
                    used[i] = false;
                }
            }
        }
    
    public:
        vector<vector<int>> permuteUnique(vector<int> &nums)
        {
            result.clear();
            path.clear();
            sort(nums.begin(), nums.end()); 
            vector<bool> used(nums.size(), false);
            backtracking(nums, used);
            return result;
        }
    };