zoukankan      html  css  js  c++  java
  • 【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

  • 相关阅读:
    C#枚举中使用Flags特性
    WPF 设置输入只能英文
    PHP array_merge_recursive() 函数
    PHP array_merge() 函数
    PHP array_map() 函数
    PHP array_keys() 函数
    PHP array_key_exists() 函数
    [HNOI2016]网络
    WPF 设置输入只能英文
    WPF 设置输入只能英文
  • 原文地址:https://www.cnblogs.com/haoworld/p/offer42-lian-xu-zi-shu-zu-de-zui-da-he.html
Copyright © 2011-2022 走看看