491. 递增子序列

难度中等88

给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是2。

示例:

1
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. 给定数组中可能包含重复数字,相等的数字应该被视为递增的一种情况。

通过次数7,099

提交次数14,688

使用回溯算法进行dfs;主要要和那道全排列进行比较和区分;

使用set可以减少重复(我感觉剪枝更快但是不好写)

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
27
28
29
30
31
32
33
34
class Solution {
public:
set<vector<int>>result;
void dfs(vector<int>&nums,vector<int>&temp,int pos){
if(temp.size()==0){
temp.push_back(nums[pos]);
}
for(int i=1;i<nums.size();++i){
if(i+pos>nums.size()-1||nums[i+pos]<temp.back()){
continue;
}else{
temp.push_back(nums[pos+i]);
result.insert(temp);
dfs(nums,temp,pos+i);
temp.pop_back();
}
}
}
vector<vector<int>> findSubsequences(vector<int>& nums) {
//感觉是回溯算法做的;
vector<int>temp;
for(int i=0;i<nums.size();++i){
temp.clear();
dfs(nums,temp,i);
}
vector<vector<int>>ans;
set<vector<int>>::iterator it;
for(it=result.begin();it!=result.end();++it){
ans.push_back(*it);
}
return ans;

}
};