【组合回溯】【树枝+树层去重】Leetcode 491. 非递减子序列
---------------🎈🎈题目链接🎈🎈-------------------
解法1
【树层去重】:如果在同层元素重复(这里无法排序,所以无法使用之前的flag,采用hashset) continue跳过
【树枝去重】:树枝必须按照从小到大,如果本层的某个元素小于上一层父节点大小 continue跳过
class Solution {
List<List<Integer>> result = new ArrayList<>();
List<Integer> temp = new ArrayList<>();
public List<List<Integer>> findSubsequences(int[] nums) {
if(nums.length<2) return result;
helper(nums,0,Integer.MIN_VALUE);
return result;
}
public void helper(int[] nums, int start, int upnum){
HashSet<Integer> myhash = new HashSet<>();
for(int i = start; i < nums.length ; i++){
if(nums[i] < upnum){ // 如果本层的某个元素小于上一层父节点大小 continue跳过 【树枝必须按照从小到大】
continue;
}
if(myhash.contains(nums[i])){ // 如果在同层元素重复(这里无法排序,所以无法使用之前的flag,采用hashset) continue跳过 【树层去重】
continue;
}
temp.add(nums[i]);
myhash.add(nums[i]);
if(temp.size()>=2){
result.add(new ArrayList<>(temp));
}
helper(nums,i+1,nums[i]);
temp.removeLast();
}
}
}