LeetCode OJ平台上Maximum Subarray题目O(n)复杂度解决方案

来源:互联网 发布:免费dede织梦cms模板 编辑:程序博客网 时间:2024/05/17 04:28

原始题目如下,意为寻找数组和最大的子串,返回这个最大和即可。

Find the contiguous subarray within an array (containing at least one number) which has the largest sum.

For example, given the array [−2,1,−3,4,−1,2,1,−5,4],
the contiguous subarray [4,−1,2,1] has the largest sum = 6.

最普通的方法就是两层循环来寻找,复杂度为O(n^2).

在木易先森的指导下,有一个极其简单的O(n)复杂度的方法:

-    先找出数组max值,如果max小于0 ,啥也别说了,直接返回max.

-    设置辅助变量currentmax=0;数组从头至尾扫描一遍

     -    如果currentmax + A[i] <= 0,意味着这个子串对于我们寻找最大和是没有任何帮助的,此时,直接再置currentmax = 0

     -    如果currentmax + A[i] > 0,意味着这个子串的和是有意义的,将这个和跟max比较,时刻保持max的值是当前最理想的最大值

-    最后返回max即可

源代码如下:

public class Solution {    public static int maxSubArray(int[] A) {        if(A.length == 0)            return 0;        int max = A[0];        for(int i = 0; i < A.length; i ++)            if(A[i] > max)                max = A[i];        if(max <= 0)            return max;        int currentmax = 0;        for(int i = 0;i < A.length; i ++){        currentmax += A[i];        if(currentmax <= 0){        currentmax = 0;        continue;        }        else{        if(currentmax > max)        max = currentmax;        }        }        return max;        }}


0 0