题目描述
输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。
要求时间复杂度为O(n)。
來源:力扣(LeetCode)
解题思路
- 由于最大 连续子数组和为不固定长度,且时间复杂度要求在 O(N) 内完成。因此在
nums
中每一个数字进入时,尙未加入当前数字前,需要写条件进行判断:
- 若前面累加之
res
为负数的话,则res
更新为当前数字nums[i]
。等同于res
重新计算加总 => 从nums[i]
开始计算是因nums[i]
的数值 + 负值,将会比当前nums[i]
更小。 - 每次循环的结尾,更新
res += nums[i]
。 - 每次循环的结尾,更新
max_res
的数值 => res 与 max_res 比较。
- 测试案例
nums = [-2,1,-3,4,-1,2,1,-5,4]
nums = [-2, -1]
nums = [-1,-2]
nums = [1,-2,0]
nums = [-1, 0, -2]
nums = [31,-41,59,26,-53,58,97,-93,-23,84]
Python 代码
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
if not nums:
return None
res = nums[0]
if len(nums) == 1:
return res
max_res = res
for i in range(1,len(nums)):
if res < 0:
res = nums[i]
else:
res += nums[i]
max_res = max(max_res, res)
return max_res