力扣:递增子序列java

力扣:递增子序列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();回溯,弹出当前节点

        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值