1.解析
题目大意,求解长度至少为2的所有递增子序列。
2.分析
涉及求解所有子序列,一般都是利用递归或者迭代的方法进行求解。类似的题目有很多,但本题存在的难点在于:
①存在重复的元素,这样就会出现重复的子序列,所以,我们要借助hashtree存储结果
②子序列递增,可以每次将当前子序列的最后一个元素与当前变量到的元素进行对比,如果小于当前元素,意味着当前元素不能加入该子序列。
class Solution {
public:
vector<vector<int>> findSubsequences(vector<int>& nums) {
vector<vector<int>> dp(1);
set<vector<int>> res;
for (int num : nums){
int n = dp.size();
for (int i = 0; i < n; ++i){
if (!dp[i].empty() && dp[i].back() > num) continue; //当前元素如果小于子序列的最后一个元素,则该元素不属于子序列,因为不是递增的
dp.push_back(dp[i]);
dp.back().push_back(num);
if (dp.back().size() >= 2) res.insert(dp.back()); //利用hashtree自动去重的功能
}
}
return vector<vector<int>>(res.begin(), res.end());
}
};