LeetCode53
三种方法
1.暴力法
二重循环求出每个开头的最大的
2.分治法
class Solution:
# Leetcode 53. Maximum Subarray
# Divide And Conquer
# N is the size of nums
# Time Complexity: O(N)
# Space Complexity: O(logN)
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(leftMax, leftSum)
# from mid to rightmost
rightSum = nums[mid+1]
rightMax = rightSum
for i in range(mid+2, r+1):
rightSum += nums[i]
rightMax = max(rightMax, rightSum)
return leftMax + rightMax