很直观的backtracking类的题目,不需要多讲,要注意去重。关于去重的思路可以参考Permutations II。时间复杂度O(k),k为IS(Increasing Subsequences)的数量,空间复杂度O(d),d为最长的IS。代码如下:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Solution { | |
public: | |
vector<vector<int>> findSubsequences(vector<int>& nums) { | |
vector<int> curr; | |
vector<vector<int>> res; | |
backtrack(res, nums, curr, 0); | |
return res; | |
} | |
private: | |
void backtrack(vector<vector<int>>& res, vector<int>& nums, vector<int>& curr, int idx) | |
{ | |
if(curr.size() > 1) | |
res.push_back(curr); | |
if(idx == nums.size()) | |
return; | |
unordered_set<int> used; | |
for(int i = idx; i < nums.size(); ++i) | |
{ | |
if((curr.empty() || nums[i] >= curr.back()) && used.find(nums[i]) == used.end()) | |
{ | |
used.insert(nums[i]); | |
curr.push_back(nums[i]); | |
backtrack(res, nums, curr, i + 1); | |
curr.pop_back(); | |
} | |
} | |
} | |
}; |
No comments:
Post a Comment