最大子数列问题之Kadane算法

最大子数列问题的目标是在数列的一维方向找到一个连续的子数列,使该子数列的和最大。例如,对一个数列[-2, 1, -3, 4, -1, 2, 1, -5, 4],其中连续子数列中和最大的是[4, -1, 2, 1],其和为6。该问题最初是由Ulf Grenander教授在1977年提出的,直到1984年才由Jay Kadane提出了该问题的线性算法,该算法虽然长度很短,但其实并不容易理解。

Kadane算法

在正式介绍算法之前让我们来分析一下这个问题。我们先将问题进行拆分,指定数组中某个元素nums[i](假设求值最大子数列问题的数组为nums)作为最大子数列的末尾元素时,能找到的最大子数列的值是多少?我们会发现nums[i]作为末尾元素时,最大子数列问题的值必然是num[i]本身或者是nums[i-1]作为末尾元素时能找到的最大子数列再拼接上nums[i](当以nums[i-1]作为末尾元素时能找到的最大子数列问题的值为负数时,此时以nums[i]作为末尾元素的最大子数列问题的值就是nums[i]本身)。那么我们是不是只需要从头到尾遍历一遍数组,依次计算出每个位置的元素nums[i]作为末尾元素时能找到的最大子数列问题的值,即可找到全局的最大子数列的值。

我们来看看代码:

    public int maxSubArray(int[] nums) {
        int maxEndingHere = nums[0];
        int maxSoFar = nums[0];

        for (int i = 1; i < nums.length; i++) {
            int num = nums[i];
            maxEndingHere = Math.max(num, maxEndingHere + num);
            maxSoFar = Math.max(maxEndingHere, maxSoFar);
        }

        return maxSoFar;
    }

代码中,maxEndingHere表示以元素nums[i]结尾时最大子数列问题的值,maxSoFar表示遍历到nums[i]时,求得的全局最大子数列问题的值。

参考:
清晰解题: 寻找最大子数列-Kadane算法.

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值