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 };

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM