力扣 最大子数组和

动态规划,前缀和,维护状态更新。

题目

从题可以看出,找的是最大和的连续子数组,即一个数组中的其中一个连续部分。从前往后遍历,每遍历到一个数可以尝试做叠加,注意是尝试,因为有可能会遇到一个很大的负数,把前面加起来的都抵消掉,显然不是所要的,因此在dp中需要一个做结果集的维护,与更新后的总数做比较,看看是否需要做更新。

java 复制代码
class Solution {
    public int maxSubArray(int[] nums) {
        int[] f = new int[nums.length];
        f[0] = nums[0];
        int ans = f[0];
        for (int i = 1; i < nums.length; i++) {
            f[i] = Math.max(f[i - 1], 0) + nums[i];
            ans = Math.max(ans, f[i]);
        }
        return ans;
    }
}

然后这里用类似滚动数组的思想做优化,可以少用一个数组做空间复杂度上的优化。

java 复制代码
class Solution {
    public int maxSubArray(int[] nums) {
        int ans = Integer.MIN_VALUE; 
        int f = 0;
        for (int x : nums) {
            f = Math.max(f+ x, x) ;
            ans = Math.max(ans, f);
        }
        return ans;
    }
}

这题还可以用前缀和实现,子数组的元素和等于两个前缀和的差,可以一边遍历数组计算前缀和,一边维护前缀和的最小值。由于题目要求子数组不能为空,应当先计算前缀和减去最小前缀和,再更新最小前缀和。

时间复杂度:O(n),空间复杂度:O(1)。

java 复制代码
class Solution {
    public int maxSubArray(int[] nums) {
        int ans = Integer.MIN_VALUE;
        int minPreSum = 0;
        int preSum = 0;
        for (int x : nums) {
            preSum += x; 
            ans = Math.max(ans, preSum - minPreSum); 
            minPreSum = Math.min(minPreSum, preSum); 
        }
        return ans;
    }
}

动态规划要找准状态转移方程及所需更新的状态。

相关推荐
小信丶6 分钟前
Spring Cloud Stream EnableBinding注解详解:定义、应用场景与示例代码
java·spring boot·后端·spring
无限进步_10 分钟前
【C++】验证回文字符串:高效算法详解与优化
java·开发语言·c++·git·算法·github·visual studio
亚历克斯神10 分钟前
Spring Cloud 2026 架构演进
java·spring·微服务
七夜zippoe14 分钟前
Spring Cloud与Dubbo架构哲学对决
java·spring cloud·架构·dubbo·配置中心
海派程序猿14 分钟前
Spring Cloud Config拉取配置过慢导致服务启动延迟的优化技巧
java
阿维的博客日记25 分钟前
为什么不逃逸代表不需要锁,JIT会直接删掉锁
java
William Dawson26 分钟前
CAS的底层实现
java
Meme Buoy32 分钟前
18.补充数学1:生成树-最短路径-最大流量-线性规划
数据结构·算法
paeamecium33 分钟前
【PAT甲级真题】- Count PAT‘s (25)
c++·算法·动态规划·pat考试·pat
汀、人工智能34 分钟前
[特殊字符] 第89课:岛屿数量
数据结构·算法·数据库架构·图论·bfs·岛屿数量