LeetCode 53. Maximum Subarray

该博客介绍了如何使用动态规划解决LeetCode第53题——最大子数组和。通过分析,将原问题转化为寻找前序子数组和当前数字和的最大组合。在遍历过程中,若前序子数组和小于0,则舍弃,否则保留并更新最大值。这种方法避免了暴力枚举导致的时间复杂度过高问题。

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

LeetCode 53. Maximum Subarray

题目链接

分析过程

由题意,需要在给出的数组中,找出和最大的连续子数组。

解法一(不推荐)

暴力枚举。通过双重 for 循环,计算所有子数组的和,其中最大的和即为该题的结果。

代码实现略过。在 LeetCode 中,以该方式提交会导致超时。

解法二(推荐)

动态规划(DP)。将原问题转为子问题:寻找前序子数组当前数字和最大的组合。当前数字的值无法被主观控制,而前序子数组的和可以控制。因此,为达到和最大的情况,需要确保前序子数组的和大于 0,否则它就是在“帮倒忙”。
整理一下逻辑,当前序子数组的和小于 0 时,应当舍弃该前序子数组;当前序子数组的和大于等于 0 时,该前序子数组可以被加入到后续的计算中。

代码实现为:

public static int maxSubArray(int[] nums) {
    // 将最大值设置为最小的 int 值
    int max = Integer.MIN_VALUE;
    // 将临时子数组的和设置为 0
    int tmp = 0;
    // 遍历数组
    for (int num : nums) {
        // 临时子数组的值为其本身与当前遍历到的数字之和
        tmp += num;
        // 如果最大值比临时子数组的值小,则更新为临时子数组的值
        if (max < tmp) {
            max = tmp;
        }
        // (关键!)临时子数组的值小于 0,意味着在后续的计算中,当前临时子数组的加入只会让新的临时子数组的值变得更小
        // 例如:tmp = -1,则无论如何,tmp + num < num
        // 由此可得,当 tmp 的值小于 0 时,tmp 应当重置为 0
        if (tmp < 0) {
            tmp = 0;
        }
    }
    return max;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值