【java】剑指offer42_连续子数组的最大和

122 篇文章 0 订阅

题目描述:

输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。

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

示例1:

输入: nums = [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
提示:

1 <= arr.length <= 10^5
-100 <= arr[i] <= 100

参考解题思路:动态规划,不同位置数字a[i]代表0...i上最大连续子序列和,a[0]=arr[0]设置一个最大值max,初始值为数组中的第一个数字。当进来一个新的数字arr[i+1]时,判断到他前面数字子序列和a[i]+arr[i+1]跟arr[i+1]哪个大,前者大就保留前者,后者大就说明前面连续数字加起来都不如后者一个新进来的数字大,前面数字就可以舍弃,从arr[i+1]开始,每次比较完都跟max比较一下,最后的max就是最大值。

public int maxSubArray(int[] nums) {
        if (nums.length == 1) {
            return nums[0];
        }
        int sumMax = nums[0];
        int sumNow = nums[0];
        for (int i = 1; i < nums.length; i++) {
            sumNow = Math.max(sumNow + nums[i], nums[i]);
            if (sumNow >= sumMax) {
                sumMax = sumNow;
            }
        }
        return sumMax;
    }

复杂度分析:

时间复杂度 O(N): 线性遍历数组 nums 即可获得结果,使用 O(N) 时间。
空间复杂度 O(1): 使用常数大小的额外空间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值