动态规划
dp[i]表示到当前位置为止最多个数的递增子序列
简单的对每个位置从头遍历
class Solution:def lengthOfLIS(self, nums):size = len(nums)dp = [1] * sizefor i in range(1, size):for j in range(i):if nums[i] > nums[j]:dp[i] = max(dp[i], dp[j] + 1)return max(dp)
进阶版:
dp+二分
建一个空列表(递增),i遍历整个nums数组,当列表为空或i大于列表最大值,添加i到列表中(最长子序列长度+1),进行下一个i;当i没有在列表中出现过(避免重复),将i插入列表中(对i的插入位置进行二分查找,找到i大于左侧的元素且小于右侧的元素位置,将右侧大于i的元素替换为i)
(原理是把列表中每个位置index的元素定义为:满足index+1长度的递增子序列的最小的最后一个值)
class Solution:def lengthOfLIS(self, nums):res = []for i in nums:if not res or i > res[-1]:res.append(i)continueif i not in res:l, r = 0, len(res) - 1while l < r:mid = (l + r) // 2if i > res[mid]:l = mid + 1else:r = midres[l] = ireturn len(res)