leetcode 491. 递增子序列

给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是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]]

说明:

  1. 给定数组的长度不会超过15。
  2. 数组中的整数范围是 [-100,100]。
  3. 给定数组中可能包含重复数字,相等的数字应该被视为递增的一种情况。

这种算法的复杂度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 };

其实拿到题,知道思路,就是不能联想到怎么实现,对递归的使用还是不熟练,多多积累吧

猜你喜欢

转载自www.cnblogs.com/mr-stn/p/9031491.html