给你一个整数数组 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 <= 105
-104 <= nums[i] <= 104
解决手段——贪心、前缀和
一、代码剖析
通过比较前缀和与当前下标所指向值的大小,如果前缀和大于当前值,那么保留前缀和继续加上当前值,若前缀和小于当前值,那么丢掉前面的前缀和,将前缀和设置为当前值,再重新以上操作,直至数组循环结束
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
res = 0 #存储当前的前缀和
realAns = -float("INF") #比较大小,刚开始要定义无穷
for i in range(len(nums)):
res += nums[i] #记录当前的前缀和
if res < nums[i]: #如果当前前缀和没有此时的nums[i]大
res = nums[i] #用当前值替换掉前缀和
realAns = max(res,realAns) #不断比较前缀和保留最大的一个
return realAns
二、注意要点(套路
- 看题目给的nums[i]的范围
若出现负数时,要用到取max,min的话,定义需要定无穷大(切不可定义0,若数组里全都是负数,最大前缀和则为0)
realAns = -float("INF")
realAns = max(realAns,res)
- 能不在return写三目运算就不要写,因为执行用时和内存消耗都会增加
尽量在程序开始限制特殊条件,比如长度为1的数组、空数组等
最后防不住再用三目运算去return