LeetCode热题100--53.最大子数组和--中等

1. 题目

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

子数组是数组中的一个连续部分。

示例 1:

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

输出:6

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

示例 2:

输入:nums = [1]

输出:1

示例 3:

输入:nums = [5,4,-1,7,8]

输出:23

2. 题解

java 复制代码
class Solution {
    public int maxSubArray(int[] nums) {
        int ans = nums[0];
        int sum = 0;
        for(int num : nums){
            if(sum > 0){
                sum += num;
            }else{
                sum = num;
            }
            ans = Math.max(ans,sum);
        }
        return ans;
    }
}

3. 解析

出自这位老师:画手大鹏:画解算法:53. 最大子序和

  1. int ans = nums[0];
    ans变量初始化为数组的第一个元素,这表示在遍历开始时,默认的最大子数组和就是第一个元素。这是因为如果所有数都是负数的情况,最大值只能是其中最大的那个。
  2. int sum = 0;
    sum变量用于跟踪当前正在考虑的连续子数组的和,初始化为0。这个初始值表示在遍历开始时还没有累加任何元素。
  3. for(int num : nums)循环体
    这是一个遍历整个nums数组的循环,使用的是数组遍历的常见方式。
    int num : nums:将循环变量num赋值为当前遍历的nums数组中的元素。
  4. if(sum > 0){ sum += num; } else { sum = num; }
    这里的条件判断用于决定如何更新sum:
    如果当前累积和sum大于0:这意味着继续向当前子数组中添加num不会使总和变为负数,反而可能会增加。因此,将num加到sum上。
    否则(即sum <=0):意味着继续向当前子数组添加num会导致总和不增大或者变成负数。为了寻找可能更大的子数组和,应该重新开始一个新的子数组,其值就是当前的num。
  5. ans = Math.max(ans, sum);
    在每一步循环中,更新ans为当前最大值与当前sum的最大值。
    Math.max(ans, sum) 比较当前最大的ans和当前的sum,取较大的那个作为新的ans。
  6. }结束循环
    结束for循环,继续处理下一个元素。
  7. return ans;
    返回最终的ans值,即整个数组的最大子数组和。
相关推荐
luckys.one3 小时前
第9篇:Freqtrade量化交易之config.json 基础入门与初始化
javascript·数据库·python·mysql·算法·json·区块链
~|Bernard|4 小时前
在 PyCharm 里怎么“点鼠标”完成指令同样的运行操作
算法·conda
战术摸鱼大师4 小时前
电机控制(四)-级联PID控制器与参数整定(MATLAB&Simulink)
算法·matlab·运动控制·电机控制
Christo34 小时前
TFS-2018《On the convergence of the sparse possibilistic c-means algorithm》
人工智能·算法·机器学习·数据挖掘
好家伙VCC5 小时前
数学建模模型 全网最全 数学建模常见算法汇总 含代码分析讲解
大数据·嵌入式硬件·算法·数学建模
liulilittle7 小时前
IP校验和算法:从网络协议到SIMD深度优化
网络·c++·网络协议·tcp/ip·算法·ip·通信
bkspiderx8 小时前
C++经典的数据结构与算法之经典算法思想:贪心算法(Greedy)
数据结构·c++·算法·贪心算法
中华小当家呐9 小时前
算法之常见八大排序
数据结构·算法·排序算法
沐怡旸10 小时前
【算法--链表】114.二叉树展开为链表--通俗讲解
算法·面试
tju新生代魔迷10 小时前
数据结构:双向链表
数据结构·链表