Given an integer array nums, return the length of the longest strictly increasing subsequence.
A subsequence is a sequence that can be derived from an array by deleting some or no elements without changing the order of the remaining elements. For example, [3,6,2,7] is a subsequence of the array [0,3,1,6,2,2,7].
Example 1:
Input: nums = [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.
Example 2:
Input: nums = [0,1,0,3,2,3]
Output: 4
Example 3:
Input: nums = [7,7,7,7,7,7,7]
Output: 1
Constraints:
1 <= nums.length <= 2500
-104 <= nums[i] <= 104
Follow up: Can you come up with an algorithm that runs in O(n log(n)) time complexity?
-------------------------------------------------------------------------------------------------------------------
O(n^2)的解法容易想到, 这里记录一下O(nlog(n))的解法。
Solution:
维护一个数组,如果当前元素num比结果数组中的值都大,当前元素num就添加到结果数组末尾,最大长度加1。否则,用二分法找到结果数组中第一个比num大的元素,用num替换掉该元素。这样才可能使后续序列更长。即使后续序列不会更长,该替换操作也不会影响最终结果。(最终的结果数组值可能不是最终的递增序列值,但最大长度是一样的)
算法详细说明见官方题解:
code:
public int lengthOfLIS(int[] nums) {
int ans = 0;
int[] dp = new int[nums.length];
for(int num : nums) {
int l = 0, h = ans;
while(l < h) {
int mid = (l + h) / 2;
if(dp[mid] < num)
l = mid + 1;
else
h = mid;
}
dp[l] = num;
if(l == ans)
ans++;
}
return ans;
}