每日一题算法:2020年8月25日 [递增子序列] findSubsequences

2020年8月25日 递增子序列 findSubsequences

在这里插入图片描述

class Solution {
   
    public List<List<Integer>> findSubsequences(int[] nums) {
   

    }
}

解题思路:

这道题的简单做法似乎有些太简单了,直接遍历数组,只需要时间复杂度n2 就可以遍历所有的元素的所有存在的连续递增子序列。

但是这么做的肯定不是最优的,因为你能得到长度为3的子序列那么必定可以得到长度为2的两个子序列,但是没有减少这一次计算,也就导致了连续长度越长,越是浪费次数。所以实际上是可以优化的,下面说一说优化的思路。

之前:

1,2,3,4,5

我们先根据1,得到,1,2

​ 1,2,3

​ 1,2,3,4

​ 1,2,3,4,5

然后根据2得到 2,3

​ 2,3,4

​ 2,3,4,5

但是实际在计算1的递增子序列的时候已经处理过以2开头的递增子序列了。为什么要在2的时候再计算一遍呢?这个重复的流程必须省略。

优化的思路是,使用迭代。

如果当前长度大于1,长度-1之后先处理长度-1后的串。

如果当前的第一个和第二个数字能组成子串,那么将能组成的所有子串返回给上一层。

接收到上一层返回的所有链表,如果,当前的第一个值比第二个值小(递增),将上一层返回的链表中都加上当前的首元素,组成新的链表,加入返回值中。

代码实现:

List<List<Integer>> res=new ArrayList<>();
public List<List
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值