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

67 阅读1分钟

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

491. 递增子序列

题目链接:491. 递增子序列

  • 要有个set或者map存入之前浏览过的数字,使其不再形成新的分支
  •  class Solution {
     public:
         vector<vector<int>> res;
         vector<int> path;
         vector<vector<int>> findSubsequences(vector<int>& nums) {
             backTrack(nums, 0);
             return res;
         }
         void backTrack (vector<int>& nums, int startIndex) {
             if(path.size() >= 2) {
                 res.push_back(path);
             }
             //同一层需要去重
             unordered_set<int> uset;
             for (int i = startIndex; i < nums.size(); i++) {
                 if(uset.count(nums[i]) == 0) {
                     uset.insert(nums[i]);
                 } else {
                     continue;
                 }
                 if(!path.empty() && nums[i] < path.back()) {
                     continue;
                 }
                 path.push_back(nums[i]);
                 backTrack(nums, i + 1);
                 path.pop_back();
             }
         }
     };
    

46. 全排列

题目链接:46. 全排列

  • 使用used数组跳过用过的数字,并且for循环从0开始

47. 全排列 II

题目链接:47. 全排列 II

  • 加个判断if(i > 0 && used[i-1] == false && nums[i] == nums[i - 1])continue;