给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是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) {
int numsSize = nums.size();
vector<int> tempRes;//中间结果
set<vector<int>> result;//先将所有结果保存在set中,方便去重
myDFS(result, nums, tempRes, -100, 0);//开始搜索
return vector<vector<int>>(result.begin(), result.end());
}
//lastNum是上一次放入tempRes中的元素(第一次初始化为-100),beginIndex是当前访问的下标
void myDFS(set<vector<int>> &result, vector<int>& nums, vector<int>& tempRes, int lastNum, int beginIndex) {
int numsSize = nums.size();
//搜索到了尾端
if (beginIndex == numsSize) {
if (tempRes.size() > 1) {//判断这个结果是否符合要求
result.insert(tempRes);//插入到集合中
}
}
else {
//跳过这个元素
myDFS(result, nums, tempRes, lastNum, beginIndex + 1);
//或者当这个元素符合放入条件(递增)
if (lastNum <= nums[beginIndex]) {
tempRes.push_back(nums[beginIndex]);
myDFS(result, nums, tempRes, nums[beginIndex], beginIndex + 1);
tempRes.pop_back();
}
}
return;
}
};