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

参考:

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
# 动态规划
# 0053.最大子序列和

class Solution:
    def maxSubarr(self, nums: [int]) -> int:
        """
        动态规划
        1.dp定义及下标
        - dp[i]:包括下标i之前的最大连续子序列和为dp[i]
        2.递推公式
        状态*2
        - 由上个dp[i-1] + nums[i]
        - update,重新算, nums[i]
        3.初始化
        - dp[0] = nums[0]
        4.遍历顺序
        - 向后遍历
        :param nums:
        :return:
        """
        if len(nums) == 0: return 0
        dp = [0] * len(nums)
        dp[0] = nums[0]
        res = nums[0]
        for i in range(1, len(nums)):
            dp[i] = max(dp[i-1]+nums[i], nums[i])
            res = max(dp[i], res)
        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<len(nums);i++ {
		count = 0
		for j:=i;j<len(nums);j++ {
			count += nums[j]
			if count > 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
}
// 动态规划
func maxSubarr(nums []int) int {
	if len(nums) == 0 {return 0}
	dp := make([]int, len(nums))
	dp[0] = nums[0]
	var res int = nums[0]
	for i:=1;i<len(nums);i++ {
		dp[i] = max(dp[i-1]+nums[i], nums[i])
		res = max(res, dp[i])
	}
	return res
}

func max(a, b int) int {
	if a > b {return a}
	return b
}

posted on 2021-11-26 22:30  进击的davis  阅读(27)  评论(0编辑  收藏  举报

导航