classSolution:defmaxSubArray(self, nums: List[int])->int:iflen(nums)==1:return nums[0] preSum =[0]*(len(nums)+1)for idx, n inenumerate(nums): preSum[idx+1]= preSum[idx]+ n res =-inf for idx, p inenumerate(preSum):for i inrange(idx): res =max(res, p-preSum[i])return res # 前缀和比较好写,但是上面复杂度太高,没法AK# 其实每次我们只需要减去最小的前缀和,维护一个最小的前缀和,就不需要多一层循环。优化如下classSolution:defmaxSubArray(self, nums):iflen(nums)==1:return nums[0] res =-inf preSum =0 minPreSum =0for n in nums: preSum += n res =max(res, preSum - minPreSum) minPreSum =min(minPreSum, preSum)return res
思路2:dp
定义dp[i],表示以nums[i]j结尾的最大子数组和。当来到第i个位置,有两种可能
以dp[i] = nums[i],单独成一个子数组
dp[i] = dp[i-1] + nums[i],这种情况需要dp[i-1] >=0
代码
classSolution:defmaxSubArray(self, nums): dp =[0]*len(nums) dp[0]= nums[0]for i inrange(1,len(nums)): dp[i]=max(dp[i-1],0)+ nums[i]returnmax(dp)
classSolution:defmerge(self, intervals: List[List[int]])-> List[List[int]]: intervals.sort(key=lambda p:p[0]) res =[]for p in intervals:if res and p[0]<= res[-1][1]: res[-1][1]=max(ans[-1][1], p[1])else:# 这是第一个区间 或者 新来的区间和之前的区间没有交集 res.append(p)return res
classSolution:defrotate(self, nums: List[int], k:int)->None:defreverse(i, j):while i < j: nums[i], nums[j]= nums[j], nums[i] i +=1 j -=1 n =len(nums) k %= n # 防止k比数组大 reverse(0, n-1) reverse(0, k-1) reverse(k, n-1)
代码2:使用python自带的reverse语法
defrotate2(self, nums: List[int], k:int)->None:# python也有自带的reverse语法 n =len(nums) k %= n nums.reverse() nums[:k]=reversed(nums[:k]) nums[k:]=reversed(nums[k:])
classSolution:defproductExceptSelf(self, nums: List[int])-> List[int]: n =len(nums) pre =[1]*n for i inrange(1, n): pre[i]= pre[i-1]* nums[i-1] suf =[1]*n for i inrange(n-2,-1,-1): suf[i]= suf[i+1]* nums[i+1]return[p * s for p, s inzip(pre, suf)]
五、41. 缺失的第一个正数
思路:将每个数字放到自己值对应的索引上
代码:
classSolution:deffirstMissingPositive(self, nums: List[int])->int: n =len(nums)for i inrange(n):# 当前数字大小在列表范围内且没有放到对应的索引位置上。while1<= nums[i]<= n and nums[nums[i]-1]!= nums[i]: nums[nums[i]-1], nums[i]= nums[i], nums[nums[i]-1]for i inrange(n):if nums[i]!= i +1:return i +1# 如果都对上了return n +1