此题是众多LIS相关的母题目。很重要。两种思想求,贪心(NlogN)和DP(N方)
贪心:
class Solution:
def lengthOfLIS(self, nums: List[int]) -> int:
N = len(nums)
res = [float('inf') for _ in range(N)]
for i in range(len(nums)):
idx = bisect.bisect_left(res, nums[i]) #非严格递增(两个相邻元素可以一样大)用 right,严格递增用left。
res[idx] = nums[i]
for pos in range(len(res)-1, -1, -1):
if res[pos] != float('inf'):
return pos + 1
return 0
DP:
class Solution:
def lengthOfLIS(self, nums: List[int]) -> int:
if not nums:return 0
res = [1 for _ in range(len(nums))]
for i in range(1, len(nums)):
for j in range(i):
if nums[i] > nums[j]:
res[i] = max(res[i], res[j]+1)
return max(res)