题目
参考两个题目:
300.最长递增子序列
354. 俄罗斯套娃信封问题
Python
法1:动态规划
class Solution:
def lengthOfLIS(self, nums: List[int]) -> int:
n = len(nums)
dp = [1] * n
max_len = 1
for i in range(1, n):
for j in range(0, i):
if nums[j] < nums[i]:
dp[i] = max(dp[i], dp[j] + 1)
max_len = max(max_len, dp[i])
return max_len
法2:二分+谈心
class Solution:
def lengthOfLIS(self, nums: List[int]) -> int:
arr = [] # dp[i]表示长度为i+1的最小元素
for x in nums:
idx = bisect_left(arr, x)
if idx == len(arr):
arr.append(x)
else:
arr[idx] = x
return len(arr)
Java
法1:DP
必须掌握,O(N^2) + O(N)
class Solution {
public int lengthOfLIS(int[] nums) {
int[] dp = new int[nums.length];
Arrays.fill(dp, 1);
int res = 1;
for (int i = 1; i < nums.length; ++i) {
for (int j = 0; j < i; ++j) {
if (nums[i] > nums[j]) {
dp[i] = Math.max(dp[i], dp[j] + 1);
}
}
res = res > dp[i] ? res : dp[i];
}
return res;
}
}
法2:二分搜索
O(NlgN) + O(N)
patience sorting(耐心排序),参考《算法小抄》p100,介绍详细!
本文介绍了两种求解最长递增子序列的方法:一种是利用动态规划(O(N^2)+O(N)),展示了Solution类中的lengthOfLIS方法;另一种是结合二分搜索的耐心排序(O(NlgN)+O(N)),详述了《算法小抄》中相关内容。
586

被折叠的 条评论
为什么被折叠?



