Maximum Subarray Algorithm

简介:

算法导论4.2-5提供了一种线性时间内解决的方法。

思路是,最大子串有一个特性,从前向后逐个累加,过程中和始终为正。这是因为如果计算到某个数,和为负,则去掉包括这个数的前面这部分,剩下的子串和会更大,这和之前认为的最大子串是冲突的。

因此从前往后逐个累加求和,如果和为负,则从下一个开始重新累加。在这个过程中找出和的最大值即可。


package cpt4;

import Utils.P;

public class Ex1s5 {

    /**
     * find max subarray in O(n)
     * @param array
     * @return max < 0 means all are negative. max = 0 means all are zero.
     */
    public static int[] maxSubarray(int[] d) {
        int max = Integer.MIN_VALUE;
        int start = 0, end = 0, tempStart = 0;
        int count = 0;
        for (int i = 0; i < d.length; i++) {
            count += d[i];
            if (count < 0) {
                count = 0;
                tempStart = i + 1;
            } else if (count > max) {
                max = count;
                start = tempStart;
                end = i;
            }
        }
        return new int[] { start, end, max };
    }

    public static void main(String[] args) {
        int[] d = { 13, -3, -25, 20, -3, -16, -23, 18, 20, -7, 12, -5, -22, 15,
                -4, 7 };
        P.rintln(maxSubarray(d));
    }
}


早晨上班路上,想起来这个算法的正确性靠前面一条特性无法保证。查了下确实还需要另一个结论。http://blog.csdn.net/joylnwang/article/details/6859677

目录
相关文章
Leetcode 53.Maximum Subarray
题意简单,给出一个数组,求出其中最大的子数组和。 这种简单题目背后蕴藏着很巧妙的解题方法。其实只需要遍历一次数组就可以求得解。 思路是这样的,你想想看,如果一段子数组的和是负数, 那么这一段子数组不可能是最大和数组的一部分,丢掉重新从下一个位置开始选。
49 0
|
存储
LeetCode 329. Longest Increasing Path in a Matrix
给定一个整数矩阵,找出最长递增路径的长度。 对于每个单元格,你可以往上,下,左,右四个方向移动。 你不能在对角线方向上移动或移动到边界外(即不允许环绕)。
75 0
LeetCode 329. Longest Increasing Path in a Matrix
LeetCode 209. Minimum Size Subarray Sum
给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组。如果不存在符合条件的连续子数组,返回 0。
117 0
LeetCode 209. Minimum Size Subarray Sum
LeetCode 53. Maximum Subarray
给定整数数组nums,找到具有最大总和的子数组(数组要求连续)并且返回数组的和,给定的数组包含至少一个数字。
44 0
|
人工智能
codeforces 1092——F:Tree with Maximum Cost (树上DP)
codeforces 1092——F:Tree with Maximum Cost (树上DP)
118 0
Maximum Subsequence Sum
最大连续子列和问题,在此给出题解 (浙大PTA https://pintia.cn/problem-sets/16/problems/665)
LeetCode之Max Consecutive Ones
LeetCode之Max Consecutive Ones
135 0
|
人工智能 机器学习/深度学习
1007. Maximum Subsequence Sum (25)
简析:求最大子列和,并输出其首末元素。在线处理,关键在于求首末元素。 本题囧,16年9月做出来过,现在15分钟只能拿到22分,有一个测试点过不了。
976 0