LeetCode——最大子数组

博客围绕给定整数数组求最大总和的连续子数组问题展开。采用动态规划方法,可从前或从后计算,从前计算时将第i个元素前最大子序列和存于一维数组dp,第i+1个元素值取决于dp[i]正负。时间复杂度O(n),空间复杂度O(n)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

给定整数数组nums,找到具有最大总和并返回其总和的连续子数组(包含至少一个数字)。 Example:

Input: [-2,1,-3,4,-1,2,1,-5,4], Output: 6 Explanation: [4,-1,2,1] has the largest sum = 6.

Follow up: If you have figured out the O(n) solution, try coding another solution using the divide and conquer approach, which is more subtle.

代码实现

动态规划

动态规划

这是一道非常典型的动态规划题,为了求整个字符串最大的子序列和,我们将先求较小的字符串的最大子序列和。这里我们从后向前、从前向后计算都是可以的。在从前向后计算的方法中,我们将第i个元素之前最大的子序列和存入一个一维数组dp中,对第i+1个元素来说,它的值取决于dp[i],如果dp[i]是负数,那就没有必要加上它,因为这只会拖累子序列的最大和。如果是正数就加上它。最后我们再讲第i+1个元素自身加进去,就得到了第i+1个元素之前最大的子序列和。

复杂度

时间复杂度 O(n) 空间复杂度 O(n)

代码

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

转载于:https://juejin.im/post/5cd04805f265da034e7ea1d0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值