当前位置: 首页 > article >正文

【leetcode100】最大子数组和

1、题目描述

给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组是数组中的一个连续部分。

示例 1:

输入:nums = [-2,1,-3,4,-1,2,1,-5,4]

输出:6

解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。

2、初始思路

2.1 思路

使用前缀和进行计算,通过前缀和数组的最大值减去最小值来计算最大子数组和。

class Solution(object):
    def maxSubArray(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        presum = (len(nums)+1)*[0]
        presum[0] = 0
        max_sum = 0
        sum_i = 0
        for i in range(len(nums)):
            sum_i += nums[i]
            presum[i+1] = sum_i
        return max(presum) - min(presum)

2.2 犯错点

这样处理并不正确,因为前缀和考虑的是前n个数组总体的和,通过前缀和数组的最大值减去最小值来计算最大子数组和不能考虑到其位置的正确性。

正确使用如下,但运行时间较长。

class Solution(object):
    def maxSubArray(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        presum = (len(nums)+1)*[0]
        presum[0] = 0
        sum_i = 0
        for i in range(len(nums)):
            sum_i += nums[i]
            presum[i+1] = sum_i
        print(presum)
        min_sum = 0
        max_sum = float('-inf')
        for num in presum[1:]:
            max_sum = max(max_sum,num-min_sum)
            min_sum = min(min_sum,num)
        return max_sum

3 优化算法

3.1 思路

使用动态规划,当前面产生负和时,影响整个数组的增益,抛弃负和,重新计算和。

class Solution(object):
    def maxSubArray(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        if not nums:
            return 0  # 如果数组为空,返回0

        current_sum = 0
        max_sum = float('-inf')  # 初始化最大和为负无穷

        for num in nums:
            current_sum += num
            if current_sum > max_sum:
                max_sum = current_sum
            if current_sum < 0:
                current_sum = 0

        return max_sum


http://www.kler.cn/a/413273.html

相关文章:

  • 鸿蒙本地模拟器 模拟TCP服务端的过程
  • DDR3与MIG IP核详解(一)
  • LangGraph中的State管理
  • CodeTON Round 9 (Div. 1 + Div. 2, Rated, Prizes!)(前五道)
  • Vue.js --- 生命周期
  • Python学习第十三天--面向对象,类和对象
  • Oracle-伪劣rowid和rownumber的用法
  • 设计模式学习之——责任链模式
  • Educator头歌:离散数学 - 图论
  • 【若依ruoyi Vue前端线上个人服务器部署】以及常见报错问题解决
  • 2024年11月27日Github流行趋势
  • 【Flink-scala】DataStream编程模型之 窗口的划分-时间概念-窗口计算程序
  • Day28 贪心算法 part02
  • CTF之密码学(费纳姆密码)
  • LLamafactory API部署与使用异步方式 API 调用优化大模型推理效率
  • 初识Linux(4):Linux基础环境工具(下)
  • YOLO的框架及版本迭代
  • Mac安装及合规无限使用Beyond Compare
  • Linux iptables 命令详解
  • 【设计模式】【结构型模式(Structural Patterns)】之享元模式(Flyweight Pattern)
  • 八、利用CSS制作导航栏菜单的习题
  • Easyui 实现订单拆分开票功能
  • 算法新篇章:AI如何在数学领域超越人类
  • 【CSS in Depth 2 精译_061】9.4 CSS 中的模式库 + 9.5 本章小结
  • python的openpyxl库设置表格样式:字体/边框/对齐/颜色等
  • ES6中,Set和Map的区别 ?