动态规划:
def lengthOfLIS1( nums):
dp=[1]*len(nums)
maxlen=1
for i in range(1,len(nums)):
for j in range(i):
if nums[i]>nums[j] and dp[i]<dp[j]+1:
dp[i]=dp[j]+1
maxlen=max(maxlen,dp[i])
return maxlen
nums=[10,9,2,5,3,7,101,18]
lengthOfLIS1( nums)
二分查找:
因为是递增序列,所以stack中最大值是stack[-1]
如果nums[i]大于当前stack中所有值则压栈
如果nums[i]小于stack[-1],则stack中存在某个点,nums[i]可以替换该点,但是要判断是否和前一个值相等,相等的话就不需要
import bisect
def lengthOfLIS1( nums):
if not nums:
return 0
stack=[nums[0]]
for i in range(1,len(nums)):
if nums[i]>stack[-1]:
stack.append(nums[i])
else:
pos=bisect.bisect(stack,nums[i])
if stack[pos-1]!=nums[i]:
stack[pos]=nums[i]
return stack
nums= [10, 22, 9, 33, 21, 50, 41, 60, 80]
lengthOfLIS1( nums)
或者用bisect_left避免重复
import bisect
def lengthOfLIS1( nums):
if not nums:
return 0
stack=[nums[0]]
for i in range(1,len(nums)):
if nums[i]>stack[-1]:
stack.append(nums[i])
else:
pos=bisect.bisect_left(stack,nums[i])
stack[pos]=nums[i]
return stack
nums= [10, 22, 9, 33, 21, 50, 41, 60, 80]
lengthOfLIS1( nums)
bisect模块:
处理的是排好序的数组,bisect_left是处理插入重复数据,返回插入点位置。