题目描述:给定一个整数数组,找到一个具有最大和的子数组,返回其最大和。
样例:给出数组[−2,2,−3,4,−1,2,1,−5,3],符合要求的子数组为[4,−1,2,1],其最大和为6
如果数组全是正数,那么最大子数组当然就是整个数组了。正因为穿插了负数,才让这道题有点难度。
所以,思路是这样的:
1. 依次求取前n位的和, 那么,当然有两种情况:和为正;和为负
2. 如果和为正,那么加上第n + 1位起,之后的某段数组是有意义的。我们可以假设第n + 1位起,到第m位,和为10,而前n位的和为3,两个一加得13,肯定比10大
3. 而如果和为负,则不管再加入怎样一段数组,都是没有意义的,因为那一段被加入的数组,“不带”前n位“玩”,自己会更大
总结一下,也就是说,我们可以依次加和,每次都和最大值比较,但是,如果这个和为负了,那么就没有必要再考虑前n位了,直接重新从n + 1位开始计算即可。
这个逻辑稍微有点绕,看代码会更清楚一些:
class Solution:
"""
@param nums: A list of integers
@return: An integer denote the sum of maximum subarray
"""
def maxSubArray(self, nums):
max_value = nums[0]
temp_sum = 0
for i in nums:
temp_sum += i
max_value = max(max_value, temp_sum)
temp_sum = max(temp_sum, 0)
return max_value
# write your code here
这实际上是贪心法的初步运用,贪在什么地方呢?一定要大于0的和,才肯继续加上他,扩大最大值。