3.2课堂练习

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

要求:

输入一个整形数组,数组里有正数也有负数。

数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。

如果数组A[0]......A[J-1]首尾相邻,允许A[i-1], ......A[n-1],A[0]......A[j-1]之和最大。

同时返回最大子数组的位置。

求所有子数组的和的最大值。

设计思路:在解决这个问题之前看了网上很多的方法,理解到解决本问题的关键就是把环形数组从某处截开,然后从截开出开始遍历数组,遍历的长度不能大于数组长度。其实也相当于先遍历一遍数组,求最大值,然后把第一个数放到最后一个位置再遍历求最大值,直到最后一个元素为第一个位置时。就结束了所有遍历

 1 #include<iostream.h>
 2 
 3 void main()
 4 {
 5     int n,i,c,d,length;   
 6     cout<<"输入数组元素个数:"<<endl;
 7     cin>>length;
 8     n=2*length;    
 9 
10     int *a=new int[n];  
11     cout<<"输入数组的元素:"<<endl;
12     for( i=0;i<length;i++)
13     {
14         cin>>a[i];
15     }
16     int max=a[0];   
17     int s=0;   
18     for( i=0;i<length;i++)
19     {
20         s=0;    
21         for(int j=i;j<length+i;j++)
22         {
23             s=s+a[j];
24             if(s>max)
25             {
26                 max=s;
27                 c=i;
28                 d=j;
29             }    
30         }
31         a[length+i]=a[i];
32     }
33     cout<<endl;
34     cout<<"最大子数组的和为:"<<endl;
35     cout<<max<<endl;
36     cout<<"返回位置:"<<endl;
37     cout<<c<<endl;
38     cout<<d<<endl;
39 }

思想感悟:每次遇到问题自己需要了解,多查询,然后就是自己需要自己思考,建立自己的思维。这样才有进步。

时间记录日志

 

posted @ 2018-11-04 16:37  哈哈哇小程序  阅读(136)  评论(0编辑  收藏  举报