1. 程式人生 > >leetcode 491. 遞增子序列

leetcode 491. 遞增子序列

重復數 復雜度 sub class etc amp 通過 pos 復雜

給定一個整型數組, 你的任務是找到所有該數組的遞增子序列,遞增子序列的長度至少是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 };

其實拿到題,知道思路,就是不能聯想到怎麽實現,對遞歸的使用還是不熟練,多多積累吧

leetcode 491. 遞增子序列