环形数组最大子数组的和及位置
题目:
求环形数组中最大子数组的和及位置。
实验思路:
环形数组中最大子数组的和包括两种情况
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 }
运行截图:
总结:
当我们把最大数组和求出来的时候,仔细想一下,用数组的和减去最小的和,是不是就是循环数组的最大数组的和了?逆向思维其实也很重要。