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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了返回一个整型数组中最大子数组的和相关的知识,希望对你有一定的参考价值。

组员:刘伟 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  动态规划

 

 

 

 

以上是关于返回一个整型数组中最大子数组的和的主要内容,如果未能解决你的问题,请参考以下文章

返回一个整数数组中最大子数组的和。(二人结对编程)

返回一个整数数组中最大子数组的和。(二人结对编程)

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

返回一个整数数组中最大子数组的和(文件)

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

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