43.连续子数组的最大和

输入一个 非空 整型数组,数组里的数可能为正,也可能为负。

数组中一个或连续的多个整数组成一个子数组。

求所有子数组的和的最大值。

要求时间复杂度为 O(n)。

数据范围:

数组长度 [1,1000]。
数组内元素取值范围 [−200,200]。

样例:

输入:[1, -2, 3, 10, -4, 7, 2, -5]
输出:18

代码:

class Solution {
    public int maxSubArray(int[] nums) {
        //dp数组:dp[i]表示以nums[i]结尾的最大子数组和
        int[] dp = new int[nums.length];
        //初始化结果为极小值
        int res = -0x3f3f3f3f;
        //动态规划填充dp数组
        for(int i = 0;i<nums.length;i++){
            //第一个元素的最大子数组和就是它本身
            if(i==0)dp[i] = nums[i];
            //状态转移方程:
            //要么将当前元素加入前一个子数组(dp[i-1]+nums[i])
            //要么以当前元素作为新的子数组开头(nums[i])
            else dp[i] = Math.max(dp[i-1]+nums[i],nums[i]);
        }
        //遍历dp数组找出最大值
        for(int i = 0;i<nums.length;i++)res = Math.max(res,dp[i]);
        return res;
    }
}
posted @ 2025-05-28 10:21  回忆、少年  阅读(8)  评论(0)    收藏  举报