给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例:
输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
进阶:
如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-subarray
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
贪心
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
#current_num作为目前和
#新加[i]数了之后和此数比较,取较大一个作为新current_num值
#因为是取最大值,所以比较后如果current_num<nums[i],说明之前的current_num是负的,可以全部舍弃
#max_num作为最大和,每次在current_num比较后再比较更新
n=len(nums)
if n==0:
return []
current_num=nums[0]
max_num=nums[0]
for i in range(1,n):
current_num=max(nums[i],current_num+nums[i])
max_num=max(max_num,current_num)
return max_num
动态规划
def maxSubArray(self, nums: List[int]) -> int:
n=len(nums)
if n==0:
return []
for i in range(1,n):
if nums[i-1]>0:
nums[i] += nums[i-1]
return max(nums)
分治(待续)
图片来自
链接:https://leetcode-cn.com/problems/maximum-subarray/solution/zui-da-zi-xu-he-by-leetcode/
来源:力扣(LeetCode)
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
if len(nums) == 1:
return nums[0]
middle = len(nums)//2
#左边
max_left = self.maxSubArray(nums[:middle])
#右边
max_right = self.maxSubArray(nums[middle:])
#中间
max_l =nums[middle-1]
tmp=0
for i in range(middle-1, -1, -1):
tmp += nums[i]
max_l = max(tmp, max_l)
max_r =nums[middle]
tmp=0
for i in range(middle,len(nums)):
tmp +=nums[i]
max_r = max(tmp, max_r)
#取最大值
return max(max_left,max_right,max_r+max_l)