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 = nums0;
    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值,即整个数组的最大子数组和。
相关推荐
糖果豆豆6 分钟前
让 AI 自查三遍,它只会把错的说得更像对的——检查的人和被检查的,是同一个
算法·架构
总裁余(余登武)2 小时前
K-means算法改进(Python版)
python·算法·kmeans
灯澜忆梦2 小时前
【面向对象编程c++】| 指针与自定义数据类型
开发语言·c++·算法
xxwl5852 小时前
区域赛算法模版第八章---贪心(Greedy)
c++·笔记·学习·算法
CCblandy3 小时前
向量检索 ANN 参数实测:换一种数据分布,recall 掉了 51 个百分点
人工智能·python·算法·自然语言处理·性能优化
CS创新实验室3 小时前
一棵树怎么做到“自平衡还不太费力“?——红黑树的旋转与染色
数据结构·算法·红黑树·408·计算机考研
Logic1013 小时前
C语言/数据结构位运算题解:异或XOR找出被挑选一次的果子编号——只出现一次的数字
c语言·数据结构·算法·数组·位运算·时间复杂度·空间复杂度
深圳市快瞳科技有限公司3 小时前
面向端侧部署的多帧宠物身份识别:完整性评分机制与工程约束
人工智能·算法·计算机视觉·端侧ai·宠物识别·宠物ai·宠物身份识别
从小白到软工5 小时前
4-3 项目-学生成绩管理系统(上)
c语言·开发语言·数据结构·经验分享·ai编程
悠仁さん5 小时前
非类型模板参数的特化与偏特化
java·数据结构·算法