300.longest increasing subsequence

Question

Given an unsorted array of integers, find the length of longest increasing subsequence.

Example:

1
2
3
Input: [10,9,2,5,3,7,101,18]
Output: 4
Explanation: The longest increasing subsequence is [2,3,7,101], therefore the length is 4.

Note:

  • 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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class {
public int lengthOfLIS(int[] nums) {
int len = nums.length;
int[] dp = new int[len];
int max = 0;
for(int i = 0; i < len; i++){
dp[i] = 1;
for(int j = 0; j < i; j++)
if(nums[j] < nums[i])
dp[i] = Math.max(dp[i], dp[j]+1);
if(dp[i] > max)
max = dp[i];
}
System.out.println(max);
return max;
}
}

Time complexity: $O(n^2)$

corner case: nums:[] or nums:[1]

1
2

Time complexity: $O(nlog n)$