Given an unsorted array of integers, find the length of longest increasing subsequence.
For example,
Given
The longest increasing subsequence is
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?
Answer:DP + Binary Search! Time:O(n*logn), Space:O(n)!
public class Solution {
public int lengthOfLIS(int[] nums) {
if(nums == null || nums.length == 0)return 0;
int len = nums.length, maxLen=0;
int[] dp = new int[len];
dp[0] = nums[0];
//dp + Binary Search, time: O(n*logn), space: O(n)
for(int i=1; i<len; ++i){
if(nums[i] > dp[maxLen]){
dp[++maxLen] = nums[i];
}else{
int index = Arrays.binarySearch(dp, 0, maxLen, nums[i]);
if(index < 0){
index = -(index+1);
dp[index] = nums[i];
}
}
}
return maxLen + 1;
}
}
No comments:
Post a Comment