持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第4天,点击查看活动详情
一、题目描述:
53. 最大子数组和 - 力扣(LeetCode) (leetcode-cn.com)
给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组 是数组中的一个连续部分。
示例 1:
输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
示例 2:
输入:nums = [1]
输出:1
示例 3:
输入:nums = [5,4,-1,7,8]
输出:23
提示:
- 1 <= nums.length <= 10^5
- -10^4 <= nums[i] <= 10……4
进阶:如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的 分治法 求解。
二、思路分析:
我们可以把这个问题分成两种情况:
- 数列全为负数,最大子序和就是负数中的最大值。 所以在遍历数组的时候,不断记录最大值,便于最后比较。
- 数列不全为负数,我们可以采用动态规划的方法遍历一遍列表。 遍历的过程中,先把子序和为正数计为中间值:一旦子序和为负数,中间值重置为0。过程中记录下最大的中间值。
- 比较数列的最大值可以判断是哪一种情况,并进行输出。
三、AC 代码:
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
Max=0,n=len(nums),This=0,ans=nums[0]
#初始值得设置
for i in range(n):
This+=nums[i]
ans=max(ans,nums[i]) #数列中的最大值
if This>Max:
Max=This #记录遍历过程中的最大子序和
if This<0:
This=0 #子序和为负,重置为0
if ans<=0:
return ans #情况1,全为负数,取最大值
else:
return Max #情况2,不全为负数
范文参考:
最大子序和 c++实现四种解法 暴力法、动态规划、贪心法和分治法 图示讲解 - 最大子数组和 - 力扣(LeetCode)