数组练习1

结对开发实验成员:张晓菲  张哲

一、本次实验要求:

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

二、设计思想:

    开始时我们的思路便是最笨的,即利用for循环将所有子数组的和求出来,然后找出其最大子数组和输出,但是这样明显不符合O(n)的时间复杂度要求,在课堂听过他人的思路再回来整理后,有了自己的新的思路。

   其实求其最大子数组和也是有一定的规律的,一个子数组求和的过程中当其加上某一个数成负数后则表示其再加下去就没有必要了,反之则继续加下去,每次相加后都要做比比较保留其较大的值,直至循环结束,求出子数组和的最大值。

三、程序代码

 1 //返回一个整数数组中最大子数组的和
 2 //有正数、有负数、数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和、时间复杂度O(n)
 3 //张哲、张晓菲 2016/3/22
 4 
 5 #include<iostream>
 6 using namespace std;
 7 
 8 int main()
 9 {
10     int num,*arr;
11     int sum=0;
12     cout<<"请输入数组元素个数:";
13     cin>>num;
14     arr=new int[num];
15     if(arr==NULL)
16     {
17         cout<<"申请空间失败!"<<endl;
18         return 1;
19     }
20     cout<<"请输入数组元素的值:";
21     for(int i=0;i<num;i++)
22         cin>>arr[i];
23     int max=arr[0];
24     for(int j=0;j<num;j++)
25     {
26         if(sum<=0)
27             sum=arr[j];
28         else
29             sum=sum+arr[j];
30         if(sum>max)
31             max=sum;
32     }
33     cout<<"子数组和的最大值为:"<<max<<endl;
34     delete [] arr;
35     return 0;
36 }

四、实验截图

五、总结

   本次实验其实重在对问题的一个分析与思考,可能一开始大家都会想到一个最简单的方法,即求出所有子数组的和,取其最大,但对于编程来说,这个程序思路其实不是罪简单的,通过对问题的一个全面思考,将其程序简化,相当于用编程的思想去解决遇到的问题,这是本次实验我体会最深的地方。

原文地址:https://www.cnblogs.com/zz0906/p/5316274.html