题目链接如下:53. 最大子数组和https://leetcode.cn/problems/maximum-subarray/
#最简单的想法,用数组进行保存更新
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
if len(nums)==1:
return nums[0]
sum=[0]*len(nums)
sum[0]=nums[0]
for i in range(1,len(nums)):
if sum[i-1]<0:#小于0,重新开始
sum[i]=nums[i]
else:#大于0,继续加和
sum[i]=sum[i-1]+nums[i]
return max(sum)
#用动态规划进行求解,优化内存
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
if len(nums)==1:
return nums[0]
sum=nums[0]
maxsum=nums[0]
for i in range(1,len(nums)):
if sum<0:
sum=nums[i]
maxsum=max(maxsum,sum)
else:
sum+=nums[i]
maxsum=max(maxsum,sum)
return maxsum
优化后的效率非常高:
系统的多种算法求解:
4种经典算法可以实现:
(1)暴力循环
(2)动态规划,求解第n个状态的通解状态方程dp[i]=max(dp[i-1]+nums[i],nums[i])
(3)贪心算法,局部最优
(4)分治
class Solution:
# 法1:暴力解法
def maxSubArray1(self, nums):
maxsum=float("-inf")#初始值为无穷小
for i in range(len(nums)):
sum=0
for j in range(i,len(nums)):
sum+=nums[j]#从初始开始值开始,依次往后加
if sum>maxsum:#如果有更大值,则更新最大值
maxsum=sum
return maxsum
#法2:动态规划
def maxSubArray2(self, nums):
maxsum=nums[0]#定义初始值,从前向后检索
sum=nums[0]
for i in range(1,len(nums)):
sum=max(sum+nums[i],nums[i])#不断更新sum最大值
maxsum=max(maxsum,sum)#更新maxsum最大值
return maxsum
#法3:贪心,局部最优解
def maxSubArray3(self, nums):
#if len(nums)==1:
#return nums[0]
maxsum=nums[0]
sum=nums[0]
for i in range(1,len(nums)):
if sum<0:#当局部求和小于0时,需要重新开始下一个局部子序列
sum=0
sum+=nums[i]
maxsum=max(maxsum,sum)#从前往后检索,进行加和,过程中保留最大值
return maxsum
#法4:分治
def maxSubArray3(self, nums):
if __name__=='__main__':
nums=[-1,-2,4,-5,3,-2,4,-1,2,3]
a=Solution()
print(a.maxSubArray3(nums))