Maximum subarray
最大子序和
Given an integer array nums, find the contiguous subarray (containing at least one number) which has the largest sum and return its sum.
给出一个都是interger的array,找到具有最大和的连续子序列,并且返回其sum,这个子序列包含至少一个整数
Follow up: If you have figured out the O(n) solution, try coding another solution using the divide and conquer approach, which is more subtle. 分治法
1 暴力法
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
result=float('-inf')
for i in range(0,len(nums)):
temp=0
for j in range(i,len(nums)):
temp=temp+nums[j]
result=max(result,temp)
return result
这个方法time complexity: O(N^2),在提交的时候会超出时间限制
2 动态规划
```python
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
dp=[0]*len(nums)
dp[0]=nums[0]
result=nums[0]
for i in range(1,len(nums)):
dp[i]=max(dp[i-1]+nums[i],nums[i])
result=max(result,dp[i])
return result
(1)目的是找最值,用动态规划
(2)每一步找到自己的最大子序列和。有两个选项:和前面和并;不和前面和并。
分治法
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
return self.getMax(nums,0,len(nums)-1)
def getMax(self,nums,l,r):
if l==r:
return nums[l]
mid=l+(r-l)//2
leftSum=self.getMax(nums,l,mid)
rightSum=self.getMax(nums,mid+1,r)
crossSum=self.crossSum(nums,l,r)
return max(leftSum,rightSum,crossSum)
def crossSum(self,nums,l,r):
mid=l+(r-l)//2
#from mid to leftmost
leftSum=nums[mid]
leftMax=leftSum
for i in range(mid-1,l-1,-1):
leftSum+=nums[i]
leftMax=max(leftSum,leftMax)
# from mid to rightmost
rightSum=nums[mid+1]
rightMax=rightSum
for i in range(mid+2,r+1):
rightSum+=nums[i]
rightMax=max(rightSum,rightMax)
return leftMax+rightMax
对于我来讲,分治法有点绕