1. 程式人生 > >題目:返回一個整數陣列中最大子陣列的和。

題目:返回一個整數陣列中最大子陣列的和。

要求

1 要求程式必須能處理1000 個元素; 2 每個元素是int32 型別的; 3 輸入一個整形陣列,數組裡有正數也有負數。 4 陣列中連續的一個或多個整陣列成一個子陣列,每個子陣列都有一個和。 5 如果陣列A[0]……A[j-1]首尾相鄰,允許A[i-1], …… A[n-1], A[0]……A[j-1]之和最大。 6 同時返回最大子陣列的位置。 7 求所有子陣列的和的最大值。要求時間複雜度為O(n)。

程式碼

#include<iostream>
#include<time.h>
#include<conio.h>
#define N 100000
using namespace std;
void RandIn(int IntNum,int A[])
{
	cout<<"整數"<<endl;
	for(int i=0;i<IntNum;i++)
	{
		A[i]=rand()-rand();
		cout<<A[i];	
		if(i%5==4)
			cout<<endl;
		else
			cout<<'\t';
	}
}
void SelMax(int IntNum,int A[],auto &sum)
{
	auto buffer=0;
	int count1=0;
	int count2=0;
	for(int j=0;j<=IntNum;j++)
	{
		if(j==IntNum)
		{
			j=0;
		}
		buffer+=A[j];
		count1++;
		count2++;
		if(buffer<0)
		{
			buffer=0;
			count1=0;
		}
		if(sum<buffer)
		{
			sum=buffer;
		}
		if(count1>IntNum||count2>IntNum*2)
		{
			break;
		}
	}
}
void main()
{
	
	int IntNum;
	int A[N];
	int q=0;
	while(q==0)
	{
		auto sum=0;
		srand((unsigned)time(NULL));
		cout<<"輸入整數的個數:";
		cin>>IntNum;
		RandIn(IntNum,A);
		SelMax(IntNum,A,sum);
		cout<<endl;
		cout<<sum<<endl;
		cout<<"是否繼續測試(輸入0則繼續)";
		cin>>q;
		system("cls");
	}
}
截圖
設計思路
首先隨機生成IntNum個正負數輸出五列,引入一個常量記錄累加的和,buffer進行求和的數值個數,for語句進行的運算次數,如果累加和小於0,buffer重新初始化為0,sum始終記錄下存在的最大和,為了陣列允許首尾相連和最大的情況,如果累加數count1超過IntNum跳出迴圈,或者語句進行的運算次數超出陣列數值的兩倍
設計過程
由另一名同學提供了設計思路及其解決資料首尾相連和最大值的情況,我根據其思路設計出程式,最後由其檢校,中間也遇到了一些困難,但是也被我們一一解決了
合作照片