Leetcode300.最长递增子序列
Leetcode300.最长递增子序列
赵海波给你一个整数数组
nums
,找到其中最长严格递增子序列的长度。子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,
[3,6,2,7]
是数组[0,3,1,6,2,2,7]
的子序列。示例 1:
1
2
3 >输入:nums = [10,9,2,5,3,7,101,18]
>输出:4
>解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。示例 2:
1
2 >输入:nums = [0,1,0,3,2,3]
>输出:4示例 3:
1
2 >输入:nums = [7,7,7,7,7,7,7]
>输出:1
使用单调栈和二分查找结合解体
单调栈用来维护一个严格递增的序列,二分查找用于快速定位第一个破坏当前序列递增顶的序列,并且找到后替换以维持栈的单调性
这里主要用到的策略:
- nums[i] > stack[-1]:栈顶元素比当前元素小,直接放在栈的顶部,是不是不破坏单调栈的单调递增特性
- nums[i] <= stack[-1]:栈顶元素比当前元素大,这里为了维护单调性,我们要替代栈中比它第一个比它大的元素
参考图:
代码:
1 | class Solution(object): |
评论
匿名评论隐私政策