环形数组最大子数组的和及位置

题目:

       求环形数组中最大子数组的和及位置。

实验思路:

       环形数组中最大子数组的和包括两种情况

        1、最大子数组和不包括连接处

                  设计思想见上篇

        2、最大子数组和包括连接处

                  最大子数组的和=数组的和-最小子数组的和

程序代码:

  1 #include <iostream>
  2 using namespace std;
  3 int main()
  4 {
  5     int Array[100];  //定义数组
  6     int length;   //数组长度
  7     for(length=0;;)  //输入数组  遇到Enter即为输入完
  8     {
  9         cin>>Array[length];
 10         length++;
 11         if(getchar()=='\n')
 12         {
 13             break;
 14         }
 15     }
 16     int maxSumOfArray,maxSum,minSumOfArray,minSum;  
 17     int first=0,First1=0,First2=0;    //最大子数组的第一个数的位置
 18     int num=1,Num1=1,Num2=1;   //最大子数组的个数
 19     maxSumOfArray=maxSum=minSumOfArray=minSum=Array[0];
 20     //当我们加上一个正数时,和会增加;当我们加上一个负数时,和会减少。
 21     //如果当前得到的和是个负数,那么这个和在接下来的累加中应该抛弃并重新清零,不然的话这个负数将会减少接下来的和。
 22     for(int i=1;i<length;i++)
 23     {
 24         if(maxSumOfArray+Array[i]>Array[i])      
 25         {
 26             maxSumOfArray=maxSumOfArray+Array[i];         
 27             num++;   //子数组个数+1
 28         } 
 29         else
 30         {
 31             maxSumOfArray=Array[i];
 32             first=i;   //改变子数组  子数组的第一个数的位置 改变为i   个数改为1
 33             num=1;  
 34         }
 35         //maxSum=max(maxSum,maxSumOfArray);  //变量maxSum 为maxSum 与 maxSumOfArray    取最大
 36         if(maxSum<=maxSumOfArray)
 37         {
 38             maxSum=maxSumOfArray;    //改变最终子数组 
 39             First1=first;  //改变最终子数组   First=first  Num=num
 40             Num1=num; 
 41         }
 42     }
 43     first=0;
 44     num=1;
 45     //同理求得最小子数组的和
 46     for(int i=1;i<length;i++)
 47     {
 48         //maxSumOfArray=max(maxSumOfArray+Array[i],Array[i]);   //变量maxSumOfArray 为包含Array[i] 与Array[i]    取最大
 49         if(minSumOfArray+Array[i]<Array[i])      
 50         {
 51             minSumOfArray=minSumOfArray+Array[i];         
 52             num++;   //子数组个数+1
 53         } 
 54         else
 55         {
 56             minSumOfArray=Array[i];
 57             first=i;   //改变子数组  子数组的第一个数的位置 改变为i   个数改为1
 58             num=1;  
 59         }
 60         //maxSum=max(maxSum,maxSumOfArray);  //变量maxSum 为maxSum 与 maxSumOfArray    取最大
 61         if(minSum>=minSumOfArray)
 62         {
 63             minSum=minSumOfArray;    //改变最终子数组 
 64             First2=first;  //改变最终子数组   First=first  Num=num
 65             Num2=num; 
 66         }
 67     }
 68     int sum=0;
 69     for(int i=0;i<length;i++)
 70     {
 71         sum+=Array[i];
 72     }
 73     if(sum-minSum>maxSum)
 74     {
 75         cout<<"最大子数组和:"<<sum-minSum<<endl;
 76         for(int i=0;i<length-Num2;i++)    //输出位置  和具体数     第一个位置为0
 77         {
 78             int j=First2+Num2+i;
 79             if(j<length)
 80             {
 81                 cout<<""<<j<<""<<Array[j]<<"  ";
 82             }
 83             else
 84             {
 85                 cout<<""<<j-length<<""<<Array[j-length]<<"  ";
 86             }
 87         }
 88     }
 89     else
 90     {
 91         cout<<"最大子数组和:"<<maxSum<<endl;
 92         for(int i=0;i<Num1;i++)
 93         {
 94             int j=First1+i;
 95             cout<<""<<j<<""<<Array[j]<<"  ";
 96         }
 97     }
 98     cout<<endl;
 99     return 0;
100 }

运行截图:

总结:

     当我们把最大数组和求出来的时候,仔细想一下,用数组的和减去最小的和,是不是就是循环数组的最大数组的和了?逆向思维其实也很重要。

我的结对小伙伴:http://www.cnblogs.com/L-Damon-v/p/5325511.html

posted @ 2016-03-27 20:36  _小学生  阅读(1226)  评论(3编辑  收藏  举报