leetcode 334 Increasing Triplet Subsequence 详细解答
解法1
在这里也可以很容易的想到用二分法来做,定义一个数组 bins,
这里二分法的过程:
举例:
nums = [1,3,5,4,7,2]
bins = [ ]
找出 nums[i] 应该插入都 bins 数组哪个位置,这里借用 bisect 可以实现二分插入。如果nums[i]应该插入bins的末尾,则说明nums[i]比bins中的数字都要大,在这里用bisect_left,如果是插入到中间某个位置,则替换该位置的数字。
i = 0, nums[0], 应该插入bins末尾。则bins = [1]
i = 1, nums[1], 也是插入bins末尾,bins = [1, 3]
i = 2, nums[2], …, bins = [1, 3, 5]
i = 3, nums[3], 插入中间某个位置,替换该位置的数字5,所以bins = [1, 3, 4]
i = 4, nums[4], 插入bins末尾,bins = [1, 3, 4, 7]
i = 5, nums[5], 替换插入中间那个位置的数,bins = [1, 2, 4, 7]
最后bins就是最长的递增子序列
在这个题,其实就可以将数组bins的长度限制为3,如果达到了3,则说明有3个元素的递增子序列。
代码如下:
时间复杂度O(N), 空间复杂度是O(1)
解法2
思路跟上面很相似,但只需要设前两个数即可,first, second。
如果值小于first,则将值赋给first,
如果值小于second, 则将值赋给second,
否则返回True
代码如下:
时间复杂度为O(N),空间复杂度为O(1)