zoukankan      html  css  js  c++  java
  • 0053最大子序和 Marathon

    给定一个整数数组 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
    }
    
  • 相关阅读:
    对互联网海量数据实时计算的理解 + 业界开源实时流处理系统小结 _ (技术调研参考)
    SQL语句的添加、删除、修改多种方法 —— 基本操作
    leetcode-验证二叉搜索树
    leetcode-汉明距离
    leetcode-帕斯卡三角形
    leetcode-位1的个数(位与运算)
    leetcode-打家劫舍(动态规划)
    leetcode-回文链表
    leetcode-反转链表
    leetcode-最大子序和(动态规划讲解)
  • 原文地址:https://www.cnblogs.com/davis12/p/15609865.html
Copyright © 2011-2022 走看看