动态规划
dp[i]表示到当前位置为止最多个数的递增子序列
简单的对每个位置从头遍历
class Solution:
def lengthOfLIS(self, nums):
size = len(nums)
dp = [1] * size
for 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)
continue
if i not in res:
l, r = 0, len(res) - 1
while l < r:
mid = (l + r) // 2
if i > res[mid]:
l = mid + 1
else:
r = mid
res[l] = i
return len(res)