首页 > 其他分享 >13、普通数组-最大子数组和

13、普通数组-最大子数组和

时间:2024-04-08 23:30:04浏览次数:23  
标签:13 cur curMax 算法 数组 普通 当前 最大

 

思路

  1. 卡登算法(Kadane's Algorithm)是一种用于解决“最大子数组和”问题的高效算法。这个问题的目标是在一个整数数组中找到具有最大和的连续子数组。卡登算法的美妙之处在于它的简洁性和高效性——它可以在单次遍历中解决问题,时间复杂度为 O(n),其中 n 是数组的长度。

基本概念

  1. 卡登算法基于这样一个事实:连续子数组的最大和要么是当前元素本身,要么是当前元素加上前一个子数组的和(前提是这个累加的和是正数)。算法通过遍历数组并在每个步骤中更新当前子数组的最大和来工作。

算法步骤

  1. 初始化两个变量:
    1. curMax:存储当前子数组的最大和。
    2. globalMax:存储迄今为止找到的最大子数组和。
  2. 遍历数组:
    1. 对于数组中的每个元素,将其与 curMax(即当前子数组的和)相加。
    2. 如果加上当前元素的 curMax 变得更大,那么继续累加。
    3. 如果 curMax 变为负数,重置 curMax 为 0。负数不会对寻找最大子数组和有帮助。
  3. 更新全局最大值:
    1. 在每次迭代中,比较 curMax 和 globalMax,并更新 globalMax 为两者中的较大值。
  4. 返回结果:
    1. 遍历完成后,globalMax 包含了最大子数组的和。

关键思想

局部最优和全局最优:

         curMax 代表以当前元素结尾的子数组的最大和,这是局部最优解。而 globalMax 代表迄今为止的全局最优解。
        处理负数:算法的关键是如何处理负数。如果当前子数组的和变成负数,它就不可能是最优的子数组,因此重置 curMax 为 0,表示从下一个元素重新开始计算。

class Solution {
   public static int maxSubArray(int[] nums) {
    // 初始化当前子数组的和为 0
    int cur = 0;
    // 初始化最大子数组和为最小可能的整数
    int max = Integer.MIN_VALUE;

    // 遍历数组中的每个元素
    for (int i = 0; i < nums.length; i++) {
        // 将当前元素加到当前子数组的和中
        cur += nums[i];

        // 更新最大子数组和
        // 如果当前子数组的和比之前记录的最大子数组和大,则更新最大子数组和
        max = Math.max(max, cur);

        // 如果当前子数组的和变成负数,则重置为 0
        // 因为任何包含负和的子数组都不可能是最大子数组的一部分
        cur = cur < 0 ? 0 : cur;
    }

    // 返回最大子数组和
    return max;
  }

}

标签:13,cur,curMax,算法,数组,普通,当前,最大
From: https://blog.csdn.net/qq_29434541/article/details/137527661

相关文章

  • react 函数组件和hook
    函数组件1.函数组件没有生命周期2.函数组件没有this3.函数组件通过hook完成各种操作4.函数组件本身就是render函数5.props在函数第一个参数解释useState参考https://www.cnblogs.com/ssszjh/p/14581014.htmlprops参考https://www.cnblogs.com/ssszjh/p/18118746生命周期......
  • 《C语言深度解剖》:(4)深入理解一维数组和二维数组
    ......
  • Day5.一刷数据结构算法(C语言版) 242有效的字母异位词; 349两个数组的交集; 202快乐数; 1
        现在我们开始学习哈希表.        经过本次学习我认识到c++的便利,但是我使用的是c,那些功能c又用不了,导致代码长度一下子拉长了...        一刷的时候我还是先用c吧,等二刷的时候试试c++.        进入正题:        什么时候......
  • 校园台球厅人员与设备管理系统的设计与实现|SpringBoot+ Mysql+Java+ B/S结构(可运行
    本项目包含可运行源码+数据库+LW,文末可获取本项目的所有资料。推荐阅读300套最新项目持续更新中.....最新ssm+java项目文档+视频演示+可运行源码分享最新jsp+java项目文档+视频演示+可运行源码分享最新SpringBoot项目文档+视频演示+可运行源码分享2024年56套包含java,ssm......
  • CF1361E James and the Chase 题解
    Description给定一个有\(n\)个点\(m\)条边的有向强连通图。称一个点是好的当且仅当它到其他点都有且只有一条简单路径。如果好的点至少有\(20\%\)则输出所有好的点,否则输出-1。单个测试点内有多组数据。\(1\leqT\leq2\times10^3,1\leqn\leq10^5,1\leqm\leq2\time......
  • 实验一-密码引擎-3-加密API研究--20211313
    不同的加密API研究CryptoAPICryptoAPI功能功能:为应用程序开发者提供在Win32环境下使用加密、验证等安全服务时的标准加密接口。CryptoAPI处于应用程序和CSP(cryptographicserviceprovider)之间。CryptoAPI共有五部分组成:简单消息函数(SimplifiedMessageFunctions)、低层消息......
  • leetcode:合并两个有序数组
    voidmerge(int*nums1,intnums1Size,intm,int*nums2,intnums2Size,intn){intl1=m-1;intl2=n-1;intl3=m+n-1;while(l1>=0&&l2>=0)//只要有一个条件为假就跳出循环{if(num1[l1]<num2[l2]){num1[l3--......
  • 动态规划之滚动数组
    熟悉动态规划的童鞋都知道,dp的状态方程通常都是二维数组及以上。我们总将其定义为dp[N][C],例如intdp[N][C],N=10^6,C=10^6,此时空间消耗为4*N*C=4×10^12,很大可能超过比赛中题目对空间的限制。那么我们是否可以优化它呢?拿背包问题举例,我们通常将行范围定为物品个数,每处理当前......
  • 数组截取slice splice split...
    slice()截取数组的一部分数据vararr=[10,20,10,30,40,50,60]res=arr.slice(1,4)从第一个开始,截取到第四个,第一个参数是开始截取的索引值,第二个是截取到哪个位置的索引值运行结果:splice()截取数组 数组名.splice(开始索引,截取多少个)vararr=[2,63,48,5,4,......
  • day13-阶段总结
    1.知识补充1.1nolocal关键字在之前的课程中,我们学过global关键字。name='root'defouter():name="武沛齐"definner():globalnamename=123inner()print(name) #武沛齐outer()print(name) #123其实,还有一个nolocal......