491. 递增子序列

去重:
对同一父节点下同层的元素、、
因为不能进行排序,所以使用set进行去重,不重复的元素插入set,当当前元素在set中时,说明重复

  1. class Solution {
  2. public:
  3. void backtracking(vector<int>& nums,int startIndex)
  4. {
  5. if(path.size()>1)
  6. result.push_back(path);
  7. unordered_set<int> set;
  8. for(int i=startIndex;i<nums.size();i++)
  9. {
  10. //不满足条件的元素continue
  11. if(!path.empty()&& nums[i]<path.back() || set.find(nums[i])!=set.end())
  12. continue;
  13. path.push_back(nums[i]);
  14. set.insert(nums[i]);
  15. backtracking(nums,i+1);
  16. path.pop_back();
  17. }
  18. }
  19. vector<vector<int>> findSubsequences(vector<int>& nums) {
  20. backtracking(nums,0);
  21. return result;
  22. }
  23. vector<int> path;
  24. vector<vector<int>> result;
  25. };

优化

使用数组进行存储
初始化数组:
int used[201] = {0};
使用过的数字置为1

  1. class Solution {
  2. public:
  3. void backtracking(vector<int>& nums,int startIndex)
  4. {
  5. if(path.size()>1)
  6. result.push_back(path);
  7. int used[201] = {0};
  8. for(int i=startIndex;i<nums.size();i++)
  9. {
  10. //不满足条件的元素continue
  11. if (!path.empty() && nums[i] < path.back() || used[nums[i] + 100] == 1)
  12. continue;
  13. used[nums[i] + 100] = 1; // 记录这个元素在本层用过了,本层后面不能再用了
  14. path.push_back(nums[i]);
  15. backtracking(nums,i+1);
  16. path.pop_back();
  17. }
  18. }
  19. vector<vector<int>> findSubsequences(vector<int>& nums) {
  20. backtracking(nums,0);
  21. return result;
  22. }
  23. vector<int> path;
  24. vector<vector<int>> result;
  25. };