给定一个无序的整数数组,找到其中最长上升子序列的长度。
示例:
输入: [10,9,2,5,3,7,101,18]
输出: 4
解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。
说明:
可能会有多种最长上升子序列的组合,你只需要输出对应的长度即可。
你算法的时间复杂度应该为 O(n2) 。
进阶: 你能将算法的时间复杂度降低到 O(n log n) 吗?
经典题,N平方算法不再赘述,简单说一说NlogN算法。
令dp[i]表示长度为i的递增子序列结尾的最小值,显然这个dp[i]是随着i的增大而逐渐变大的,下面举个例子说明。
[10,9,2,5,3,7,101,18]这组样例,遍历数组,当遍历到nums[1] = 10时,dp[1] = 10,当nums[2] = 9时,那么dp[1] = 9,注意这里是dp[1]而不是dp[2],因为num[2]之前找不到一个值比9小,以此类推即可。
很容易可以看出,以上步骤可以总结为当遍历到第k位,要找到最后一个比num[k]小的dp[i],然后dp[i+1] = min(dp[i+1],num[k]),由于dp数组单调递增,所以找最后一个比num[k]小的值可以用二分去写。
class Solution {
public int lengthOfLIS(int[] nums) {
int len = nums.length;
int num[