给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是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]。
给定数组中可能包含重复数字,相等的数字应该被视为递增的一种情况。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/increasing-subsequences
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
类似题目
LeetCode 47. 全排列 II(回溯+搜索剪枝)
LeetCode 46. 全排列(回溯)
这里由于是无序的,可能存在相同元素,但是不连续,在一次dfs的for之前加一个哈希set
set中存在的元素再次出现时,跳过,如下例子中的1
[1,2,3,4,5,6,7,8,9,10,1,1,1,1,1]
[1,2,1,1,1]
结果为:
[[1,2],[1,1],[1,1,1],[1,1,1,1]],可以理解一下
class Solution {
vector<vector<int>> ans;
vector<int> path;
public:
vector<vector<int>> findSubsequences(vector<int>& nums) {
dfs(0, nums);
return ans;
}
void dfs(int i, vector<int> &nums)
{
unordered_set<int> s;//一次dfs中的判重
for( ; i < nums.size(); ++i)
{
if(s.count(nums[i]))//再次出现同样的值,跳过
continue;
if(path.empty() || path.back() <= nums[i])
{
path.push_back(nums[i]);
s.insert(nums[i]);
if(path.size() > 1)
ans.push_back(path);
dfs(i+1, nums);
path.pop_back();
}
}
}
};
80 ms 23.1 MB