给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是2。
示例:
输入: [4, 6, 7, 7] 输出: [[4, 6], [4, 7], [4, 6, 7], [4, 6, 7, 7], [6, 7], [6, 7, 7], [7,7], [4,7,7]]
说明:
- 给定数组的长度不会超过15。
- 数组中的整数范围是 [-100,100]。
- 给定数组中可能包含重复数字,相等的数字应该被视为递增的一种情况。
这种算法的复杂度O(n^2)
通过dfs的方法找到第i位数右边所有比它大的数,压并且压到sbuseq中,当subseq的长度大于1的时候就把它压到ans中。这样就能找到所有递增的子序列, 但是可能会出现重复的情况;
比如上面的[4,6,7,7]通过dfs的方法就会出现两个[4,6,7]的子序列,这里用unorder_set来保存subseq的最后一个元素,当新来的元素和set的最后一个元素相等的时候,就不压入subseq。这样就能避免重复子序列的出现
1 #include<algorithm> 2 #include<stack> 3 class Solution { 4 public: 5 void dfs(vector<vector<int>>& ans, vector<int>& subseq, vector<int> nums, int pos){ 6 if(subseq.size()>1) ans.push_back(subseq); 7 unordered_set<int> hash; 8 for(int i=pos; i<nums.size(); i++){ 9 if((subseq.empty() || subseq.back()<=nums[i]) && hash.find(nums[i])==hash.end()){ 10 subseq.push_back(nums[i]); 11 dfs(ans, subseq, nums, i+1); 12 subseq.pop_back(); 13 hash.insert(nums[i]); 14 } 15 } 16 } 17 18 vector<vector<int>> findSubsequences(vector<int>& nums) { 19 vector<vector<int>> ans; 20 vector<int> subseq; 21 dfs(ans, subseq, nums, 0); 22 return ans; 23 } 24 };
其实拿到题,知道思路,就是不能联想到怎么实现,对递归的使用还是不熟练,多多积累吧
原文地址:https://www.cnblogs.com/mr-stn/p/9031491.html
时间: 2024-10-03 21:09:53