今天快到150道题目,所以又练了一道动态规划,复杂度n^2有点高,但胜在简洁
class Solution:
def lengthOfLIS(self, nums: List[int]) -> int:
#很明显的动态规划题目
n = len(nums)
dp = [0]*(n+1)
dp[0]=1
for i in range(1,n):
dp[i] = max([dp[i-j]+1 if nums[i]>nums[i-j] else 1 for j in range(i+1)])
return max(dp)
思考一下优化思路:
一种是不用动态规划的思路。使用二分(这个问题有用到sort的数组)
构建一个递增序列,遍历原数组,如果一个数小于他前面的数,通过二分找到他应该处于的位置,用更小的数替换该数,这种情况下,n 不会有变化,但保留了一个更小数的信息,方便构建更新的递增序列。
时间复杂度O(nlogn)但很难想到
class Solution:
def lengthOfLIS(self, nums: List[int]) -> int:
#二分做法
import bisect
n = len(nums)
LIS = []
for i,num in enumerate(nums):
if i ==0 or num>LIS[-1]:
LIS.append(num)
elif num<LIS[-1]:
indx = bisect.bisect_left(LIS,num)
LIS[indx]= num
return len(LIS)
还有一种结合二分和动归的做法和二分本质上一样,唯一的区别是维护了一个dp数组,脱裤了放屁的做法
两个月练了150道题目了,感觉有一点了。