1. 程式人生 > >返回一維整數陣列中最大子陣列的和

返回一維整數陣列中最大子陣列的和


1.要求:
(1)輸入一個整形陣列,數組裡有正數也有負數。
(2)陣列中連續的一個或多個整陣列成一個子陣列,每個子陣列都有一個和。
(3)如果陣列A[0]……A[j-1]首尾相鄰,允許A[i-1], …… A[n-1], A[0]……A[j-1]之和最大。
(4)同時返回最大子陣列的位置。
(5)求所有子陣列的和的最大值。要求時間複雜度為O(n)。

2.設計思想 :

 通過更改陣列的長度將陣列擬合成一個迴圈陣列,將普通的一維陣列A[n]的前n-1位陣列數加到陣列A[n]後面組成一個新的陣列A[2n-1],再進行普通的一維陣列的計算

3、源程式

#inc,lude <iostream>
using namespace std;
#define N 1000
int main(int argc, char* argv[])
{
  int arry[N];
  int length=1;
  int max[N],max1; //max[N]存每一次求和的結果,在其中找最大值,為所求
  int maxweizhi[N];
  int num=0;
  int value( int arry[],int length);
  cout<<"請輸入陣列:"<<endl;
  cin >> arry[0];
  while (getchar() != '\n') //輸入陣列
  {
    cin >> arry[length];
    length++;
  }  
  for(int j=length;j<2*length-1;j++) //形成環形陣列,首位相連
  {
    arry[j]=arry[num];
    num++;
  }
  cout<<"由這幾個數形成的環形陣列";
  value(arry,2*length-1);
  return 0;
}
int value( int arry[],int length)
{
  int max[N],max1;
  int maxweizhi[N];
  for(int j=0;j<(length+1)/2;j++)
  {
    int sum=0;
    max1=-9999999; //設定最低範圍
    int z=0;
    for(int i=j;i<(length+1)/2+j;i++) //環形陣列找最大子陣列和
    {
      sum=sum+arry[i];
      if(sum>=max1)
      {
        max1=sum;
        z++;
      }
    }
    max[j]=max1;
    maxweizhi[j]=z;
  }
  int fmax=max[0];
  int q=0;
  for(int i=0;i<(length+1/2);i++) //在所有和的陣列中找最大值
  {
    if(max[i]>fmax)
    {
      fmax=max[i];
      q=i;
    }
  }
  int weizhi=maxweizhi[q];
  cout<<"最大子陣列為:"<<endl;
  for(int num=q;num<q+weizhi;num++) //輸出最大子陣列的位置
  {
    cout<<arry[num];
  }
  cout<<"其和為: "<<fmax<<endl;
  return 0;
}

 

4.執行結果截圖:

5.心得體會

通過本次實驗,讓我們對C++的掌握更加熟練,也對結對開發有了更深入的瞭解。

 

6.工作照片