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