给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是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]]
说明:
- 给定数组的长度不会超过15。
- 数组中的整数范围是 [-100,100]。
- 给定数组中可能包含重复数字,相等的数字应该被视为递增的一种情况。
解答
深度优先搜索+回溯,用set
去重,判断是否递增时,只需要判断最末尾的数字。
class Solution {
public:
vector<vector<int>> findSubsequences(vector<int>& nums) {
set<vector<int>> result;
vector<int> temp;
helper(nums, 0, result, temp);
return vector<vector<int>>(result.begin(), result.end());
}
// index为子序列的起始索引
void helper(vector<int>& nums, int idx, set<vector<int>>& result, vector<int>& temp){
if(temp.size()>=2){
result.insert(temp);
}
for(int i=idx;i<nums.size();i++){
//只查找递增子序列
if(!temp.empty() && temp.back()>nums[i]) continue;
temp.emplace_back(nums[i]);
helper(nums, i+1, result, temp);
temp.pop_back();
}
}
};