zoukankan      html  css  js  c++  java
  • 剑指Offer面试题:28.连续子数组的最大和

    一、题目描述

      HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列的和,你会不会被他忽悠住?(子向量的长度至少是1)
     

    二、解题思路

      第一反应是通过求出数组中的所有子数组。但是这样肯定不是最优解。

      下面是优化的解法:

      1.从头到尾逐个累加数字的和

      2.当累加的数字存到一个变量currSum中,如果currSum小于0,则将其置为0。否则将其与另一个变量maxSum(记录目前为止遍历数组中最大和)比较,如果大于maxSum则更新maxSum。

      3.进行一次遍历后返回maxSum。该算法时间复杂度为O(n)。

    三、代码实现

      

     1 public class 连续子数组的最大和 {
     2 
     3     public static int FindGreatestSumOfSubArray(int[] array) {
     4         if(array.length==0||null==array){
     5             return 0;
     6         }
     7         int maxSum = Integer.MIN_VALUE;
     8         int currsum = 0;
     9         for(int i=0;i<array.length;i++){
    10             if(currsum<0){
    11                 currsum = 0;
    12             }
    13             currsum += array[i];
    14             
    15             if(currsum>maxSum){
    16                 maxSum = currsum;
    17             }
    18         }
    19         return maxSum;
    20     }
    21     
    22     public static void main(String[] args) {
    23         int[] nums = {-2,-8,-1,-5,-9};
    24         System.out.println(FindGreatestSumOfSubArray(nums));
    25     }
    26 }
  • 相关阅读:
    bzoj 1017 魔兽地图DotR
    poj 1322 chocolate
    bzoj 1045 糖果传递
    poj 3067 japan
    timus 1109 Conference(二分图匹配)
    URAL 1205 By the Underground or by Foot?(SPFA)
    URAL 1242 Werewolf(DFS)
    timus 1033 Labyrinth(BFS)
    URAL 1208 Legendary Teams Contest(DFS)
    URAL 1930 Ivan's Car(BFS)
  • 原文地址:https://www.cnblogs.com/blzm742624643/p/10412585.html
Copyright © 2011-2022 走看看