版权声明:原创部分都是自己总结的,如果转载请指明出处。觉得有帮助的老铁,请双击666! https://blog.csdn.net/qq_36387683/article/details/81872445
76. 最长上升子序列
给定一个整数序列,找到最长上升子序列(LIS),返回LIS的长度。
样例
给出 [5,4,1,2,3]
,LIS 是 [1,2,3]
,返回 3
给出 [4,2,4,5,3,7]
,LIS 是 [2,4,5,7]
,返回 4
挑战
要求时间复杂度为O(n^2) 或者 O(nlogn)
说明
最长上升子序列的定义:
最长上升子序列问题是在一个无序的给定序列中找到一个尽可能长的由低到高排列的子序列,这种子序列不一定是连续的或者唯一的。
https://en.wikipedia.org/wiki/Longest_increasing_subsequence
解题思路:
定义一个特殊的dp数组,保存子序列在给定数组中的结束坐标和子序列的长度。[子序列结束坐标, 子序列的长度]
1、第一个元素为[0, 1],坐标为0,因为是自身,所以长度为1
2、对剩余元素进行处理,将i之前的dp数组,按照子序列长度进行排序tmp,然后让nums[i]和排序后的dp元素依次比较,如果大于dp元素,则dp[i] = [i, tmp[j][1] + 1],跳出循环。
3、如果对排序的DP数组tmp遍历完也没有满足条件,则该数字的以自身为结束坐标,长度为1
4、返回dp数组中长度最大的值。
class Solution:
"""
@param nums: An integer array
@return: The length of LIS (longest increasing subsequence)
"""
def longestIncreasingSubsequence(self, nums):
# write your code here
if len(nums) < 2:
return len(nums)
dp = [[0, 0] for _ in range(len(nums))]
dp[0] = [0, 1]
for i in range(1, len(nums)):
tmp = sorted(dp[:i], key = lambda x: x[1], reverse = True)
for j in range(i):
if nums[i] > nums[tmp[j][0]]:
dp[i] = [i, tmp[j][1] + 1]
break
elif j == i-1:
dp[i] = [i, 1]
return max(dp, key = lambda x: x[1])[1]