1.暴力法
直接上三次for循环
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
if(len(nums)==1):return nums[0]
maxval=nums[0]
for i in range(len(nums)):
for j in range(i+1,len(nums)+1):
v=0
for _ in range(i,j):
v+=nums[_]
if v>maxval:
maxval=v
return maxval
时间直接超时因为这是O(n3)的算法
2.优化的暴力法
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
maxval=nums[0]
for i in range(len(nums)):
v=0
for j in range(i,len(nums)):
v+=nums[j]
if v>maxval:
maxval=v
return maxval
时间复杂度O(n2)
3.分治算法
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
return self.mcs(nums,0,len(nums)-1)
def mcs(self,nums,s,t):
if(s==t):
return nums[s]
center=(s+t)//2
left=self.mcs(nums,s,center)
right=self.mcs(nums,center+1,t)
leftmaxsum=nums[center]
leftsum=nums[center]
for i in range(center-1,s-1,-1):
leftsum+=nums[i]
if leftsum>leftmaxsum:
leftmaxsum=leftsum
rightmaxsum=nums[center+1]
rightsum=nums[center+1]
for i in range(center+2,t+1):
rightsum+=nums[i]
if rightsum>rightmaxsum:
rightmaxsum=rightsum
crossmaxsum=leftmaxsum+rightmaxsum
return max(left,right,crossmaxsum)
4.动态规划
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
for i in range(1,len(nums)):
nums[i]=nums[i]+max(nums[i-1],0)
return max(nums)