Given an integer array, your task is to find all the different possible increasing subsequences of the given array, and the length of an increasing subsequence should be at least 2 .
Example:
Input: [4, 6, 7, 7] Output: [[4, 6], [4, 7], [4, 6, 7], [4, 6, 7, 7], [6, 7], [6, 7, 7], [7,7], [4,7,7]]
Note:
- The length of the given array will not exceed 15.
- The range of integer in the given array is [-100,100].
- The given array may contain duplicates, and two equal integers should also be considered as a special case of increasing sequence.
分析:假设遇到第i个数,前i-1个数组成的子数组的seqs已知,如果现在的数比某个子序列seq的结尾数字大,就可以加入该seq的后面。这里seq可以为一个数字。
eg: [4,6,7,7]
1.[4]==>seqs={4}
2.[6]==>seqs={4,[4,6],6}
3.[7]==>seqs={4,[4,6],6,[4,7],[4,6,7],[6,7],[7]}
4.[7]==>seqs={4,[4,6],6,[4,7],[4,6,7],[6,7],[7],[4,7],[4,6,7],[6,7],[4,7,7],[4,6,7,7],[6,7,7],[7,7],[7]}
上面有重复的[4,6,7],[6,7],下面用集合去重,应该有更好的方法吧?!
class Solution {
void dfs(vector<vector<int>>& seqs,vector<int>&nums,int i)
{
if(i>=nums.size()) return;
int j,n=seqs.size();
for(j=0;j<n;j++)
{
vector<int> t=seqs[j];//现有的seq
if(nums[i]>=t[t.size()-1])
{
seqs[j].push_back(nums[i]);//新的seq,结尾加入nums[i]
seqs.push_back(t);//把原本的seq加入
}
}
seqs.push_back({nums[i]});
dfs(seqs,nums,i+1);
}
public:
vector<vector<int>> findSubsequences(vector<int>& nums) {
vector<vector<int>> seqs,ans;
set<vector<int>> s;
dfs(seqs,nums,0);
for(auto i:seqs)//因为seqs里面会有重复,用集合去重
if(i.size()>1) s.insert(i);
for(auto it=s.begin();it!=s.end();it++) ans.push_back(*it);
return ans;
}
};