Fork me on GitHub

【Offer】[42] 【连续子数组的最大和】

题目描述

  输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。

牛客网刷题地址

思路分析

  动态规划的思想,可总结为如下公式:

  1. 以第i个数字结尾的子数组中所有数字的和 <0 时,如果把这个负数与第i个数累加,则得到的结果比第i个数字本身还要小,所以这种情况下以第i个数字结尾的子数组就是第i个数字本身;
  2. 如果以第i-1个数字结尾的子数组中所有数字的和 >0时,则与第i个数字累加就得到以第i个数字结尾的子数组中所有数字的和。

测试用例

  1. 功能测试:从数据流中读出奇数个数字:从数据流中读出偶数个数字。
  2. 边界值测试:从数据流中读出0个、1个、2个数字。

Java代码

public class Offer042 {
    public static void main(String[] args) {
        test1();
        test2();
        test3();
        
    }

     public static int FindGreatestSumOfSubArray(int[] array) {
            return Solution1(array);
     }

    private static int Solution1(int[] array) {
        if(array==null || array.length<=0) {
            return 0;
        }
        int curSum = 0;
        int maxSum = array[0];
        for(int i=0;i<array.length;i++) {
            if(curSum<=0) {
                curSum=array[i];
            }else{
                curSum+=array[i];
            }
            if(curSum>maxSum) {
                maxSum = curSum;
            }
        }
        return maxSum;
    }

    private static void test1() {
        int[] array ={6,-3,-2,7,-15,1,2,2};
        int maxSum = FindGreatestSumOfSubArray(array);
        System.out.println(maxSum);
    }
    private static void test2() {
    }
    private static void test3() {
    }
}

代码链接

剑指Offer代码-Java

posted @ 2019-08-19 20:39  这个世界~  阅读(88)  评论(0编辑  收藏  举报