leetcode-最大子数组和

给你一个整数数组 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

提示:

1 <= nums.length <= 105

-104 <= numsi <= 104

思路一 :求区间和,记录最大值。双层for循环枚举区间起始结束点。提前求前缀和预处理,方便求区间和。结果超时
思路二 :区间问题,维护区间状态。考虑双指针。双指针需要考虑何时移动左右指针。如果当前值大于0,一定会加入区间。因为加一个正数会使值更大。如果当前值小于0,分两种情况,区间和sumValue>0,加负值后面还可能大于0;区间和sumValue<0,求和更小,所以左指针移动到当前值。

综上,可以用一个sumValue变量表示区间和,如果sumValue小于0,就让sumValue等于0。当前值为区间起始点,开始求和。

思路一

c 复制代码
class Solution {
    public int maxSubArray(int[] nums) {
        int[] preSum = new int[nums.length+1];
        for(int i = 1;i<=nums.length;i++){
            preSum[i] = preSum[i-1]+nums[i-1];
        }
        int maxRes = Integer.MIN_VALUE;
        for(int i = 0;i<nums.length;i++){
            for(int j = i+1;j<=nums.length;j++){
                Integer sumValue = preSum[j] - preSum[i];
                maxRes = Math.max(maxRes, sumValue);
            }
        }
        return maxRes;
    }
}

思路二

c 复制代码
class Solution {
    public int maxSubArray(int[] nums) {
        int maxRes = Integer.MIN_VALUE;
        int sumValue = 0;
        for(int i = 0;i<nums.length;i++){
            if(sumValue<0){
                sumValue = 0;
            }
            sumValue += nums[i];
            maxRes = Math.max(maxRes, sumValue);
        }
        return maxRes;
    }
}
相关推荐
luj_17689 小时前
星火科技助力边远地区防病攻坚
c语言·开发语言·c++·经验分享·算法
木木子2211 小时前
# 鸿蒙 ArkTS 实战:秒表 Stopwatch(示例 5)
数据结构·华为·list·harmonyos
geats人山人海11 小时前
数据结构第六章c语言 树的存储下二叉树的概念和存储
c语言·数据结构·算法
漂流瓶jz12 小时前
UVA-12627 奇怪的气球膨胀 题解答案代码 算法竞赛入门经典第二版
算法·图论·递归·aoapc·算法竞赛入门经典·uva·12627
jarvisuni12 小时前
DeepSeekFlash前端依旧拉垮,而且变慢了很多!
前端·javascript·算法
kobesdu12 小时前
流形上的优化:SO(3)与SE(3)的广义加减法在FAST-LIO中如何简化状态估计
人工智能·算法·fastlio
白狐_79813 小时前
408 数据结构算法题 01:线性表暴力求解保分指南
java·数据结构·算法
乐观勇敢坚强的老彭13 小时前
C++信奥:开关门、开关灯问题
开发语言·c++·算法
冻柠檬飞冰走茶13 小时前
PTA基础编程题目集 7-31 字符串循环左移(C语言实现)
c语言·开发语言·数据结构·算法
Hi李耶13 小时前
【LeetCode】4-寻找两个正序数组的中位数
算法·leetcode·职场和发展