R4-dp
目录
常规方法遇到以下序列时就会变得错误
动态规划的思路
单调栈
ps:
class Solution:
def lengthOfLIS(self, nums: List[int]) -> int:
#最简单的方法
n=len(nums)
if n<2:
return n
mx=1
for i in range(n):
max_i=1
for j in range(i+1,n):
if nums[i]<nums[j]:
nums[i]=nums[j]
max_i+=1
mx=max(mx,max_i)
return mx
常规方法遇到以下序列时就会变得错误
先取了013,但0123才是最长的
观其思路,每次遍历数组后面的部分都会被遍历到,所以我们还不如从背后出发,这恰好就是
动态规划的思路
class Solution:
def lengthOfLIS(self, nums: List[int]) -> int:
#dp
if not nums:
return 0
n=len(nums)
dp=[1]*n
for i in range(n):
for j in range(i):
if nums[i]>nums[j]:
#相比我的解法关键处理的地方
dp[i]=max(dp[i],dp[j]+1)
return max(dp)
单调栈
class Solution:
def lengthOfLIS(self, nums: List[int]) -> int:
#单调栈
stack=[]
for num in nums:
if not stack or num>stack[-1]:
stack.append(num)
else:
stack[bisect.bisect_left(stack,num)]=num
return len(stack)
刁钻,合理
ps:
又get一个新知识