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值,即整个数组的最大子数组和。
相关推荐
来一碗刘肉面21 小时前
栈的应用(表达式求值)
数据结构·算法
xiaowang1234shs1 天前
怪兽轻断食技术深度测评:从断食计时引擎到AI识别算法的工程实践解析
数据库·人工智能·算法·macos·机器学习·p2p·visual studio
小果因子实验室1 天前
量化研究--策略迁移算法1研究
算法
Web极客码1 天前
如何用三段式确定性剪枝,为 LLM Agent 砍掉 35% 的 Token 成本?
服务器·人工智能·算法·机器学习
程序猿乐锅1 天前
【数据结构与算法 | 第六篇】力扣1109,1094差分数组
java·算法·leetcode
wabs6661 天前
关于图论【广度优先搜索的理论基础】
算法·图论·宽度优先
孤魂2331 天前
逻辑回归算法
算法·机器学习·逻辑回归
weixin_377634841 天前
【多模型预测】 如何合理融合多个预测分值
算法·机器学习·概率论·预测·agent预测
无风听海1 天前
Claude Agent Skills 的四种设计模式;从渐进式披露到最小权限
java·算法·设计模式