一.题目描述
给你一个整数数组 nums
,找到其中最长严格递增子序列的长度。
https://leetcode-cn.com/problems/longest-increasing-subsequence/
二.代码
public int lengthOfLIS(int[] nums) {
int len = nums.length;
if (len < 2) {
return len;
}
int[] dp = new int[len];
for (int i = 1; i < len; i++) {
for (int j = 0; j < i; j++) {
if (nums[j] < nums[i]) {
dp[i] = Math.max(dp[i], dp[j] + 1);
}
}
}
int res = 0;
for (int i = 0; i < len; i++) {
res = Math.max(res, dp[i]);
}
return res + 1;
}
public int lengthOfLIS(int[] nums) {
int len = nums.length;
if (len < 2) {
return len;
}
int[] tail = new int[len];
tail[0] = nums[0];
int end = 0;
for (int i = 1; i < len; i++) {
if (nums[i] > tail[end]) {
end++;
tail[end] = nums[i];
} else {
int left = 0;
int right = end;
while (left < right) {
int mid = left + ((right - left) >> 1);
if (tail[mid] < nums[i]) {
left = mid + 1;
} else {
right = mid;
}
}
tail[left] = nums[i];
}
}
return end + 1;
}