https://leetcode.com/problems/longest-increasing-subsequence/
最长递增子序列
本题两解:
解法一(最优解):
时间复杂度O(nLogn)。DP,dp[i]保存的是长度为i的所有递增子数组里面结尾数字最小的一个数的值。因此外层每次遍历到nums[i]的时候,只要二分查找DP即可找到要插入的位置。同时维护一个最大递增子数组长度len,当当前要插入的位置为len时,len++。
public class Solution {
public int lengthOfLIS(int[] nums) {
int[] dp = new int[nums.length];
int len = 0;
for (int n : nums) {
int i = Arrays.binarySearch(dp, 0, len, n);
if (i < 0) {
i = -(i + 1);
}
dp[i] = n;
if (i == len) {
len++;
}
}
return len;
}
}
解法二:
时间复杂度O(n2)。DP,dp[i]保存以nums[i]为结尾的递增数组的最大长度,两层遍历,内层j遍历0 ~ i - 1,如果找到所有nums[j] < nums[i]里面dp[j]最大的,则dp[i]为该数加一。
public class Solution {
public int lengthOfLIS(int[] nums) {
if (nums == null || nums.length == 0) {
return 0;
}
int res = 1;
int[] dp = new int[nums.length];
dp[0] = 1;
for (int i = 1; i < nums.length; i++) {
int max = 0;
for (int j = 0; j < i; j++) {
if (nums[j] < nums[i]) {
max = Math.max(dp[j], max);
}
}
dp[i] = max + 1;
res = Math.max(res, dp[i]);
}
return res;
}
}