Problem: 491. 非递减子序列
思路
使用回溯算法解决,需要注意的是返回条件,题目要求子序列大小大于2
1 2 3 4
| if (path.size() >= 2) res.push_back(path); if (startIndex >= nums.size()) return;
|
同时为了防止同一层,使用相同元素,我们用unordered_set<int> uset
来保存当前层使用过的元素。
同样的,其实之前的题目也可以不使用used数组,而改用unordered_set<int>
理解起来比用used数组容易。
本题的过滤逻辑也是核心所在: 需要当前数大于之前数且当前层未使用
1 2 3 4
| if ((!path.empty() && nums[i] < path.back()) || uset.find(nums[i]) != uset.end()) { continue; }
|
复杂度
时间复杂度:
添加时间复杂度, 示例: $O(n)$
空间复杂度:
添加空间复杂度, 示例: $O(n)$
Code
[]1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| class Solution { public: vector<vector<int>> res; vector<int> path; void backTracing(vector<int> nums, int startIndex) { if (path.size() >= 2) res.push_back(path); if (startIndex >= nums.size()) return; unordered_set<int> uset; for (int i = startIndex; i < nums.size(); i++) { if ((!path.empty() && nums[i] < path.back()) || uset.find(nums[i]) != uset.end()) { continue; } uset.insert(nums[i]); path.push_back(nums[i]); backTracing(nums, i + 1); path.pop_back(); } } vector<vector<int>> findSubsequences(vector<int>& nums) { backTracing(nums, 0); return res; } };
|