0053-最大子序和


给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

示例 1:

输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
示例 2:

输入:nums = [1]
输出:1
示例 3:

输入:nums = [0]
输出:0
示例 4:

输入:nums = [-1]
输出:-1
示例 5:

输入:nums = [-100000]
输出:-100000

提示:

1 <= nums.length <= 105
-104 <= nums[i] <= 104

进阶:如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的 分治法 求解。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-subarray

参考:

  • https://leetcode-cn.com/problems/maximum-subarray/solution/53-zui-da-zi-xu-he-bao-li-tan-xin-xiang-jie-by-car/

python

# 0053.最大子序和

class Solution:
    def maxSubArray(self, nums: [int]) -> int:
        """
        暴力法,两层for循环
        :param nums:
        :return:
        """
        res = -20000
        for i in range(len(nums)):
            count = 0
            for j in range(i, len(nums)):
                count += nums[j]
                res = max(count, res)
        return res

class Solution1:
    def maxSubArray(self, nums: [int]) -> int:
        """
        贪心算法:
        局部最优:当前“连续和”为负数的时候立刻放弃,从下一个元素重新计算“连续和”,
        因为负数加上下一个元素 “连续和”只会越来越小。
        全局最优:选取最大“连续和”
        :param nums:
        :return:
        """
        if len(nums) == 0: return 0
        res = -20000
        count = 0
        for i in range(len(nums)):
            count += nums[i]
            if count > res: # 不断确定最大子序和的终止位置
                res = count
            if count <= 0: # count<=0, 重置起始位置
                count = 0
        return res

golang

package greedy

// 暴力法

func maxSubArray1(nums []int) int {
	if len(nums) == 0 {
		return 0
	}
	var count int
	res := -20000
	for i:=0; i res {
				res = count
			}
		}
	}
	return res
}

// 贪心算法
func maxSubArray2(nums []int) int {
	if len(nums) == 0 {
		return 0
	}
	res := -20000
	count := 0
	for _, v := range nums {
		count += v
		if count > res {
			res = count
		}
		if count <= 0 {
			count = 0
		}
	}
	return res
}