zoukankan      html  css  js  c++  java
  • 数组和矩阵问题:子数组的最大累加和问题

    题目

      给定一个数组 arr, 返回子数组的最大累加和。

      例如, arr=[1, -2, 3, 5, -2, 6, -1],所有的子数组中,[3, 5, -2, 6] 可以累加出的最大的和 12, 所以要返回 12.

    要求

      如果 arr 的长度为 N,要求时间复杂度为 O(N), 额外空间复杂度为 O(1).

    难度

      一星

    解答

      如果 arr 中没有正数,产生的最大累积和一定是数组中的最大值。

      如果 arr 中有正数,从左到右遍历 arr, 用变量 cur 记录每一步的累加和,遍历到正数 cur 增加,遍历到负数 cur 减少。当 cur < 0 时, 说明累加到当前数出现了小于 0 的结果,那么累加的这一部分肯定不能作为产生最大累加和的子数组的左边部分,此时令 cur=0,表示从下个数开始累加。当 cur > 0 时,每一次累加都可能是最大的累加和,所以,用另外一个变量 max 全程跟踪记录 cur 出现的可能的最大值即可。

      求解最大累加和的实现过程如下面代码中的 maxSum 方法

     1 public class Main {
     2     
     3     public static void main(String[] args) {
     4         int[] arr = {1, -2, 3, 5, -2, 6, -1};
     5         System.out.println(new Main().maxSum(arr));//12
     6     }
     7     
     8     public int maxSum(int[] arr){
     9         if(arr == null || arr.length == 0) return 0;
    10         int cur = 0;
    11         int max = Integer.MIN_VALUE;
    12         for(int i = 0, len = arr.length; i < len; i++){
    13             cur += arr[i]; 
    14             max = Math.max(max, cur);
    15             cur = cur < 0 ? 0 : cur;
    16         }
    17         return max;
    18     }
    19     
    20 }
  • 相关阅读:
    文件上传跨域解决方案-jQuery-File-Upload
    求数列的的增幅,已知起始列和结束列,中间阶梯数
    mud那些坑 find_object问题
    jquery mCustomScrollbar使用
    JS的Date对象
    JS获取当前日期
    Go数组求和
    Go九九乘法表
    Go语言基础之time包
    Go语言基础之流程控制
  • 原文地址:https://www.cnblogs.com/zlxyt/p/10523328.html
Copyright © 2011-2022 走看看