• 返回一个整数数组中最大子数组的和


    要求:
    输入一个整型数组,数组里有正数也有负数。
    数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
    求所有子数组的和的最大值。要求时间复杂度为O(n)。
     
    第一次读题目时,将重点放到了输入一个既有正数也有负数的整型数组上,想着如何随机输入,从而使整个题目难以入手。
    再读题目后,将整型数组直接定义完成。题目的重点在于如何去求子数组和的最大值,并且时间复杂度为O(n)。
    刚开始思路采用最直接的办法,将所有的数组之和一个一个求出并比较,但这样做,时间复杂度不可能为O(n)。
     1 for (int i = 0; i < n; i++)
     2 {
     3     for (int j = i; j < n; j++)
     4     {
     5         for (int k = i; k < j; k++)
     6         {
     7             b += arr[k];
     8         }
     9         if (b > MaxSum)
    10             MaxSum = b;
    11                 b = 0;
    12     }
    13 }
    14 return MaxSum;

    随后通过网上查找资料,发现这是一道著名的面试题目,通过看大神的代码,得出最简洁的过程:

    因为整个数组中有正有负,因此子数组的和也有这两种可能,通过分析,当某一段子数组的和为负数时,就没有继续加下去的必要,将出现负数和之前的那个最大和用b表示出来,而新的子数组从出现负数和最后一位的下一位开始加,因此可以节约不少时间。

     1 #include<iostream>
     2 using namespace std;
     3 
     4 int MaxSum(int *arr, int size)
     5 {
     6     int MaxSum = 0;
     7     int b = 0;//b是子数组的和
     8 
     9     for (int i = 0; i < size; i++)
    10     {
    11         if (b < 0)
    12             b = arr[i];//当子数组和小于0时,与无论与后面数组如何相加,和肯定小于后一段数组之和,此时,将b重新赋值,置为下一个元素
    13         else
    14             b += arr[i];
    15         if (MaxSum < b)
    16             MaxSum = b;
    17     }
    18     return MaxSum;
    19 }
    20 
    21 int main()
    22 {
    23     int arr[10] = { 2, -3, 4, 1, -6, 2, 10, -1, 9, 5 };
    24     cout <<"最大子数组的和为:"<< MaxSum(arr, 10) << endl;
    25     return 0;
    26 }

    通过这次练习,发现自己编程能力仍然很欠缺,缺少编程实践,只能通过去查阅资料来获得思路,这次练习自己的完成度也不是很高,有待加强。

    时间记录表

    日期 开始时间 结束时间 中断时间 净时间 活动 备注
    15.3.25 19:00 21:00 10 110 编程 基础教学楼602
      22:00 22:24     看书  
    15.3.26 16:37 17:30     查阅资料  
      18:49 19:45     根据查阅的资料修改程序  
      19:51       程序完成 自己的完成度不高
                 
                 
                 
                 

    缺陷日志没有及时记录。

  • 相关阅读:
    【poj 1087 a plug for UNIX】
    收集 数据库的awr数据,生成报告
    power desinger 学习笔记三<批量执行sql语句>
    power desinger 学习笔记<二>
    power desinger 学习笔记<一>
    oracle中不曾熟悉的 to_char、to_number(未完待续)
    oracle 报错 :ORA-04052、 ORA-00604、 ORA-03106、 ORA-02063
    谈谈oracle中的临时表
    Oracle-在线重定义操作文档
    分享最近和同事处理的 解析XML的相关问题
  • 原文地址:https://www.cnblogs.com/SanShaoS/p/4369863.html
Copyright © 2020-2023  润新知