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

一、程序题目

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

二、程序要求

  1、输入一个整数数组,数组中有正数也有负数。

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

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

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

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

三、程序设计思想

  这次最大的问题是需要判断始末位置。可以形成一个固定长度的窗口,依次相加比较。首先将为两种情况,一种是跨越a[n-1],a[0]的。一种是没有跨越的。对于没有跨越的,方法很多。对于跨零点的,则可以转换成求其子数组最小和。由于数组总和确定。对于中间那段必定为最小和。总和减最小和求出最大和。对于两个最大和进行比较。得到最终结果。

四、源程序代码

复制代码
  1 //李翠冉 郝家枫
  2 //求整数数组的最大子数组的和,数组可循环
  3 
  4 #include<iostream>
  5 #include<stdlib.h>
  6 #include <time.h>
  7 using namespace std;
  8 struct ret
  9 {
 10     int max, start, end;       //用于存放最大值,及始末位置
 11 };
 12 
 13 struct ret max2(int arry[], int length)  //跨越arry[n-1]、arry[0]的最大和
 14 {
 15     int total = 0;
 16     int start1 = 0;
 17     int start2;    //起始位置
 18     int end = 0;
 19     int sum = arry[0];
 20     int minsum = arry[0];
 21     for (int i = 1; i<length; i++)
 22     {
 23         if (sum>0)
 24         {
 25             sum = arry[i];
 26             start1 = i;
 27         }
 28         else
 29         {
 30             sum = sum + arry[i];
 31 
 32         }
 33         if (minsum >= sum)
 34         {
 35             minsum = sum;
 36             end = i;
 37             start2 = start1;
 38         }
 39         total = total + arry[i];
 40     }
 41     total = total + arry[0];
 42     minsum = total - minsum;
 43     struct ret ret1 = { minsum, start2, end };
 44     return ret1;
 45 }
 46 
 47 struct ret max1(int arry[], int length)   //不跨越零点的最大和
 48 {
 49     int start1 = 0;
 50     int start2;     //起始位置
 51     int end = 0;
 52     int sum = arry[0];
 53     int maxsum = arry[0];
 54     for (int i = 1; i<length; i++)    //求出相邻数组最小和
 55     {
 56         if (sum<0)
 57         {
 58             sum = arry[i];
 59             start1 = i;
 60         }
 61         else
 62         {
 63             sum = sum + arry[i];
 64         }
 65         if (maxsum <= sum)
 66         {
 67             start2 = start1;
 68             end = i;
 69             maxsum = sum;
 70         }
 71     }
 72     struct ret ret1 = { maxsum, start2, end };
 73     return ret1;
 74 }
 75 
 76 int main()
 77 {
 78     srand((unsigned)time(0));
 79     int N;
 80     cout << "输入元素个数:";
 81     cin >> N;
 82     int a[20];
 83     for (int i = 0; i<N; i++)
 84     {
 85         a[i] = rand() % 20 - 10;
 86         cout << a[i] << "  ";
 87     }
 88     cout << endl;
 89     struct ret w = max2(a, N);   //调用max2函数,求跨越零点的最值
 90     struct ret q = max1(a, N);
 91     if (w.max>q.max)
 92     {
 93         cout << "最大和为:" << w.max << "\n起始位置:" << w.end + 1 << "\n结束位置:" << w.start - 1 << endl;
 94     }
 95     else
 96     {
 97         cout << "最大和为:" << q.max << "\n起始位置:" << q.start << "\n结束位置:" << q.end << endl;
 98     }
 99     return 0;
100 }
复制代码
posted on 2022-03-19 22:20  GHOST-CR  阅读(22)  评论(0)    收藏  举报