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值,即整个数组的最大子数组和。
相关推荐
那个村的李富贵1 天前
CANN加速下的AIGC“即时翻译”:AI语音克隆与实时变声实战
人工智能·算法·aigc·cann
power 雀儿1 天前
Scaled Dot-Product Attention 分数计算 C++
算法
Yvonne爱编码1 天前
JAVA数据结构 DAY6-栈和队列
java·开发语言·数据结构·python
熬夜有啥好1 天前
数据结构——哈希表
数据结构·散列表
琹箐1 天前
最大堆和最小堆 实现思路
java·开发语言·算法
renhongxia11 天前
如何基于知识图谱进行故障原因、事故原因推理,需要用到哪些算法
人工智能·深度学习·算法·机器学习·自然语言处理·transformer·知识图谱
坚持就完事了1 天前
数据结构之树(Java实现)
java·算法
算法备案代理1 天前
大模型备案与算法备案,企业该如何选择?
人工智能·算法·大模型·算法备案
赛姐在努力.1 天前
【拓扑排序】-- 算法原理讲解,及实现拓扑排序,附赠热门例题
java·算法·图论
我能坚持多久1 天前
【初阶数据结构01】——顺序表专题
数据结构