题目:给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例 1:
输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-subarray
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:经过前面做题的一系列经验,暴力解法不可取(即循环迭代求出所有的子数组的和然后比较求出最大的,这会超过时间限制,且时间复杂度和空间复杂度都较高);考虑复杂度为O(n)的方法,即只进行一次循环,从第一项开始,以它为最后一项计算前面连续项的和,将连续的和存储到每一项的位置,这样计算下一项连续和时仅需考虑上一项,比如,第一项就为它本身,第二项开始时比较第一项与0的大小,若第一项比0大,那么第二项即为第二项本身的值,以此类推;
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
n=len(nums)
for i in range(1,n):
nums[i]=nums[i]+max(nums[i-1],0)
return max(nums)
如果对上面的代码无法理解可以看看下面这一part:初始的求和变量记为s,将s加上下一个元素与下一个元素进行比较,如果s加上它更大的话就更新s,如果不是,这时的序列就从新的nums[i]
开始,用result
记录函数的结果。
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
n=len(nums)
s=nums[0]
result=s
for i in range(1,n):
s=max(s+nums[i],nums[i])
result=max(result,s)
return result