zoukankan      html  css  js  c++  java
  • 返回一个整型数组中最大子数组的和

    组员:刘伟 http://www.cnblogs.com/Lw-1573/p/5323542.html

    1.题目:返回一个整数数组中最大子数组的和。

    要求:
    输入一个整形数组,数组里有正数也有负数。
    数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
    求所有子数组的和的最大值。要求时间复杂度为O(n)。
     
    2.设计思想:
    本题目最大的难点是如何找出子数组并且时间复杂度为O(n);我的思路是:从总左边(a[0])开始遍历整个数组,一直到最右边结束(a[n-1]),在这个过程中记录到目前为止最大的子数组和maxsofar。maxsofar初始化成0。假如我们已经找到a[0]到a[n-1]之间的最大子数组和,那么a[0]到a[i]之间的最大子数组和是怎样的呢?要么“还是a[0]到a[i-1]之间的最大子数组和”,要么是“从a[i]开始,往前几个连续的数的最大值”。 在求从a[i]开始,往前几个连续的数的最大值时,用到如下性质:从a[i]开始往前几个连续的数的最大值maxending_i等于(maxending_i-1)+a[i]和0两者之中的最大值,即maxending_i=max((manending_i-1)+a[i],0)
    3代码:
    复制代码
     1 #include<iostream>
     2 using namespace std;
     3 int max(int a,int b)
     4 {
     5     if(a>b)
     6     {
     7        return a;
     8     }
     9     else
    10     {
    11        return b;
    12     }
    13 }
    14 int maxsum(int a[], int n)
    15 {
    16     int i;
    17     int maxsofar = 0;  //maxsofar记录到目前为止的的最大值
    18     int maxendinghere = 0; //maxendinghere记录从当前位置开始往前几个连续的数的和的最大值
    19     for (i = 0; i < n; i++)
    20     {
    21         maxendinghere = max(maxendinghere + a[i], 0);
    22         maxsofar = max(maxsofar, maxendinghere);
    23     }
    24     return maxsofar;
    25 }
    26 int main()
    27 {
    28     int n, i=0;
    29     cout<<"请输入个数:";
    30     cin>>n;
    31     cout<<"请输入数组:";
    32     int a[100000]={0};
    33     for(i=0;i<n;i++) 
    34     {
    35         cin>>a[i];
    36     }
    37     int max=maxsum(a, n);
    38     cout << "最大子数组的和为:" << max << endl;
    39     return 0;
    40 }
    复制代码

    4.总结

    刚开始本来打算是找出每一个子数组,再求其最大值,当写程序时发现程序代码比较麻烦,而且好多代码的功能是重复的,于是我就开始阅读上学期的数据结构的课本,找出了适合这个题目的思路。当我写完后,感觉如果刚开始定义了数组的长度,那么这个程序的使用范围就收到限制,于是就思考怎么能使数组的长度可以任意改变,然后我就想到了大一学习C++时讲过的指针可以定义动态数组,于是在该程序中就使用了指针

    项目计划总结:

          日期/任务      听课        编写程序         阅读相关书籍

          日总计

             周一        110           60            120        290
             周二                        120        120
             周三             60          120         180
             周四      110          60             90        320
             周五            120             60        180
             周六                60         60
             周日                 60(计划)         60
           周总计       220          360            330         910

    时间记录日志:

    日期 开始时间 结束时间 中断时间 净时间 活动 备注
    3/7 14:00 15:50 14:50 100 上课  
      19:00 22:00   180 看书  人月神话
    3/8 19:00 22:00 20:30 180 编程 作业
    3/9 19:00 22:00   180 编程 作业
    3/10 14:00 15:50 14:50 100 上课 软件单元测试
      19:00 22:00   180 看书 构建之法
    3/11 14:30  18:30   240 自习 作业
    3/12 8:00 11:30   210 编程 休息(计划)
    3/13 8:00  11:30   180 复习 休息(计划)

    缺陷记录日志:

    3/8 1 设计 编译 10min  动态规划
  • 相关阅读:
    Set,List,Map的区别
    阅读笔记15
    阅读笔记14
    阅读笔记13
    阅读笔记12
    阅读笔记11
    阅读笔记10
    架构漫谈读后感
    阅读笔记1
    暑期周记8
  • 原文地址:https://www.cnblogs.com/jiajun1/p/5323550.html
Copyright © 2011-2022 走看看