491. 非递减子序列

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