题目链接
491. 递增子序列
题目描述
给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是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]。
给定数组中可能包含重复数字,相等的数字应该被视为递增的一种情况。
解题思路
1.回溯法
如果所示,画出了回溯的一小部分,
除了直接套用回溯(DFS)的模板以外,还需要注意去重操作!
最左侧DFS的结果
[4,6]
[4,6,7]
[4,6,7,7]
紧接着回溯
[4,6,7] (重复出现)
回溯
[4,7]
[4,7,7]
回溯
[4,7]重复
所以我们需要利用Hashset进行去重操作!
AC代码
1.回溯法
class Solution {
List<List<Integer>> ans = new LinkedList<>();
LinkedList<Integer> temp = new LinkedList<>();
Set<LinkedList<Integer> > s = new HashSet<>();
void dfs (int index,int[] nums){
if(index > nums.length) return;
if(temp.size() > 1){
//必须new一个新的LinkedList对象,否则ans内容错误。
LinkedList<Integer> app = new LinkedList<>(temp);
//插入成功返回true,插入失败也就是已经存在该元素返回false
boolean f = s.add(app);
if(f) ans.add(app);
}
for(int i = index; i < nums.length; i++){
if(temp.size()==0 || nums[i] >= temp.peekLast()){
temp.add(nums[i]);
dfs(i+1,nums);
//removeLast()体现了回溯操作。
temp.removeLast();
}
}
}
public List<List<Integer>> findSubsequences(int[] nums) {
dfs(0,nums);
return ans;
}
}