力扣:递增子序列java
流程:
设置一个结果集和路径path
本题不设置used而是再当前层设置一个map
递归三部曲:
参数和返回值:参数为输入数组nums,开始下标startindex,返回值为空
对path>1时的path输入结果集//放到这里是因为要收集所有子节点
结束条件:当startIndex>nums.length时结束。
单层递归逻辑:
for循环(i=startindex;i<nums.length;i++)
循环内:节点是否小于path最后一个节点,是就continue//小于就说明不符合递增
节点是否再map中出现过,是就continue//出现过说明要进行数层去重
将节点输入map
将节点输入path
递归(nums,i+1)
回溯:当前节点弹出
代码:
class Solution {
List<List<Integer>> result = new ArrayList<>();//结果集
LinkedList<Integer> path = new LinkedList<>();//当前路径
public List<List<Integer>> findSubsequences(int[] nums) {//主函数
ascziji(nums,0);//调用递归函数
return result;
}
public void ascziji(int[] nums,int startIndex){//递归函数
if(path.size()>1){//输出到结果集
result.add(new ArrayList(path));
}
//结束条件隐藏,因为startindex>nums.length时for循环也不会进入
HashMap<Integer,Integer> map = new HashMap<>();//定义一个map保证树层无重复
for(int i=startIndex;i<nums.length;i++){
if(!path.isEmpty()&&nums[i]<path.getLast()) continue;//递增条件约束
if(map.getOrDefault(nums[i],0)>0) continue;//树层去重
map.put(nums[i],map.getOrDefault(nums[i],0)+1);//节点输入map
path.add(nums[i]);//节点输入路径
ascziji(nums,i+1);//递归下一层
path.removeLast();回溯,弹出当前节点
}
}
}