Given an unsorted array of integers, find the length of longest increasing subsequence.
For example,
Given [10, 9, 2, 5, 3, 7, 101, 18]
,
The longest increasing subsequence is [2, 3, 7, 101]
, therefore the length is 4
. Note that there may be more than one LIS combination, it is only necessary for you to return the length.
Your algorithm should run in O(n2) complexity.
Follow up: Could you improve it to O(n log n) time complexity?
经典的最长升序序列问题。
参考 这个博主分析得很清楚
目前为止的最优解就是利用二分法 时间复杂度nlogn
在binarySearch里 如果找到了element 就返回它的index 如果没有就会返回 -(插入点)-1 插入点就是最小的大于寻找元素的位置
public class Solution {
public int lengthOfLIS(int[] nums) {
int[] dp = new int[nums.length];
int len = 0;
for(int x : nums) {
int i = Arrays.binarySearch(dp, 0, len, x);
if(i < 0) i = -(i + 1);
dp[i] = x;
if(i == len) len++;//每当len等于i的时候 说明序列添加了新的element
}
return len;
}
}