代码随想录算法训练营第二十九天 | 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;