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 }
  • 相关阅读:
    SQL中UNION的使用
    [转]身份证号准确性检测
    shell中if/seq/for/while/until
    shell中数字、字符串、文件比较测试
    shell简介及变量的定义查看撤销
    grep/字符/次数匹配/锚定符/小大括号/wc/tr/cut/sort/uniq
    linux全局和个人配置文件说明
    linux文件的3个时间和7种文件类型
    linux常用配置文件和命令总结
    目录方式扩展swap分区大小
  • 原文地址:https://www.cnblogs.com/zlxyt/p/10523328.html
Copyright © 2011-2022 走看看