方法一:
// 动态规划
class Solution {
public int lengthOfLIS(int[] nums) {
int res = 0;
int n = nums.length;
int[] dp = new int[n];
dp[0] = 1;
for (int i = 0; i < n; i++) {
dp[i] = 1;
for (int j = i - 1; j >= 0; j--) {
if (nums[i] > nums[j]) {
dp[i] = Math.max(dp[i], dp[j] + 1);
}
}
res = Math.max(res, dp[i]);
}
return res;
}
}
方法二:
// 贪心+二分查找
class Solution {
public int lengthOfLIS(int[] nums) {
int res = 0;
// 存储不同长度中末尾元素的最小值
int[] tails = new int[nums.length];
for (int i = 0; i < nums.length; i++) {
int left = 0, right = res;
// 当前元素覆盖掉比它大的元素中最小的那个
while (left < right) {
int mid = (left + right) / 2;
if (nums[i] > tails[mid]) {
left = mid + 1;
} else {
right = mid;
}
}
tails[left] = nums[i];
if (right == res) {
res++;
}
}
return res;
}
}