zoukankan      html  css  js  c++  java
  • 【经典数据结构算法】(3)最大子数组和

     1 /************************************************************************/
    2 /*
    3 题目:
    4 输入一个整型数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每一个子数组都有一个和。
    5 求所有子数组的和的最大值。要求时间复杂度为O(n)。
    6 例如:
    7 输入的数组为1,-2,3,10,-4,7,2,-5,和最大的子数组为3,10,-4,7,2。
    8 因此,输出为该子数组的和18.
    9
    10 分析:
    11 可以使用Max_Sum来保存目前的最大子数组的和。假设数组的大小为n。那么从第0个开始遍历;当前子数组的和为sum。
    12 初始状态下,Max_Sum=-INF(负无穷),sum=0。
    13 遍历到第i(0<=i<=n)的时候,sum+=i,如果sum>Max_Sum时,将Max_Sum赋为sum。sum的值不清空,继续遍历;如果sum<0,则令sum=0,
    14 此时可以考虑:和最大值要么在i的左侧,它已经被记录到了Max_Sum中;要么在i的右侧,那么此时sum的值就要被清空,重新开始计算和。
    15 有没有一种可能,说和最大值既包括i的左侧和i的右侧呢?这种情况是不可能的。
    16 因为i的左侧和为负值。如果左侧和右侧的和为最大,右侧的值应更大,两者相矛盾,因此这种情况是不可能的。
    17 先计算Max_Sum,再判断sum的值是否小于零,包含了所有为负的情形.
    18 */
    19 /************************************************************************/
    20
    21 #include "stdafx.h"
    22 #include <limits.h>
    23
    24
    25 int CalculateMaxSum( int *intArray, int count )
    26 {
    27 int ret=INT_MIN;
    28 int sum=0;
    29 for(int i=0;i<count;i++)
    30 {
    31 sum+=intArray[i];
    32 if(sum>ret)
    33 {
    34 ret=sum;
    35 }
    36 if(sum<0)
    37 {
    38 sum=0;
    39 }
    40
    41 }
    42 return ret;
    43
    44 }
    45
    46 int _tmain(int argc, _TCHAR* argv[])
    47 {
    48 int intArray1[]={1,-2,3,10,-4,7,2,-5};
    49 printf("%d\n",CalculateMaxSum(intArray1,8));
    50 int intArray2[]={-3,-2,-7,-4,-5,-2,-11};
    51 printf("%d\n",CalculateMaxSum(intArray2,8));
    52 return 0;
    53 }


    作者:Chenny Chen
    出处:http://www.cnblogs.com/XjChenny/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    Unstar A File:
    star 一个文件
    列出大星号文件
    删除用户
    curl -d
    创建用户
    Check Account Info
    List Accounts
    认证ping
    python 解接口返回的json字符串
  • 原文地址:https://www.cnblogs.com/XjChenny/p/2215893.html
Copyright © 2011-2022 走看看