#include<iostream>
using namespace std;
/************************************************************************/
/*面6有一個(gè)數(shù)組a[n],里面的數(shù)只有兩種:-1或1。
i,j是兩個(gè)整數(shù),假設(shè)0<=i<=j<=n-1,找出a[i]到a[j]中連續(xù)數(shù)之和最大的部分(如果最大部分存在相等的則優(yōu)先找最短的)。
*/
/************************************************************************/
#include <iostream>
using namespace std;
typedef struct node
{
int begin;
int end;
}Node;
void Find(int number[], int length)
{
if(length == 0)//如果數(shù)組為空直接返回
return;
int Max = number[0], Acclulate = number[0];//初始化最大值為數(shù)組的第一個(gè)值
Node *Position = new Node[length];//用于存取到當(dāng)前位置可能的最大值
Node MaxPosition = {0, 0};//初始化最大的起始位置和終止位置
Position[0].begin = 0;
Position[0].end = 0;
for(int i = 1; i < length; i++)
{
if(Acclulate > 0)//前面的累積和大于零時(shí),起始位置固定,而終止位置每次都往后移動(dòng)一個(gè)位置
{
Position[i].begin = Position[i - 1].begin;//起始位置固定,只需取前一個(gè)節(jié)點(diǎn)的值.begin即可
Position[i].end = Position[i - 1].end + 1;//終止位置每次都往后移動(dòng)一個(gè)位置:前一個(gè)節(jié)點(diǎn)的值.end+1
Acclulate += number[i];//此時(shí)判斷number[i]有效,計(jì)入 累積和Acclulate中
if(Acclulate > Max)//如果 重新計(jì)算后的 累積和Acclulate大于 Max
{
Max = Acclulate;
MaxPosition = Position[i];//重新定位 最大的起始位置和終止位置
}
// cout<<"前面的累積和大于=>>";
// cout<<"起點(diǎn)number["<<MaxPosition.begin<<"]="<<number[MaxPosition.begin]
// <<",終點(diǎn)number["<<MaxPosition.end<<"]="<<number[MaxPosition.end]<<endl;
}
else//前面的累加和小于等于 零, 則重新設(shè)定起始位置和終止位置
{
Position[i].begin = i;
Position[i].end = i;
Acclulate = number[i];
if(number[i] > Max)//如果當(dāng)前number[i]大于Max,則重新設(shè)定起始位置和終止位置,否則保持不變
{
Max = number[i];
MaxPosition = Position[i];
}
// cout<<"累加和小于等于=>>";
// cout<<"起點(diǎn)number["<<MaxPosition.begin<<"]="<<number[MaxPosition.begin]
// <<",終點(diǎn)number["<<MaxPosition.end<<"]="<<number[MaxPosition.end]<<endl;
}
}
cout <<endl<< "最大的值為:" << Max << endl;
cout <<"起點(diǎn)number["<<MaxPosition.begin<<"]="<<number[MaxPosition.begin]
<<",終點(diǎn)number["<<MaxPosition.end<<"]="<<number[MaxPosition.end]<<endl;
cout << "他們分別為:";
for( i = MaxPosition.begin; i <= MaxPosition.end; i++)
cout << number[i] <<" ";
cout << endl;
delete [] Position;
}
int main(void)
{
/************************************************************************/
/*最大的值為:5
起點(diǎn) number[0]=3,終點(diǎn)number[8]=1
他們分別為:3 -1 -1 1 1 -1 1 11
*/
/************************************************************************/
// inta[10]={3,-1,-1,1,1,-1,1,1,1,-1};//總數(shù)是從0到9
/************************************************************************/
/* 最大的值為:4
起點(diǎn)number[3]=1,終點(diǎn) number[8]=1
他們分別為:1 1 -1 11 1
*/
/************************************************************************/
//inta[10]={2,-1,-1,1,1,-1,1,1,1,-1};//總數(shù)是從0到9
/************************************************************************/
/*最大的值為:3
起點(diǎn) number[0]=3,終點(diǎn)number[0]=3
他們分別為:3
*/
/************************************************************************/
//inta[10]={3,-1,-1,-1,1,-1,1,1,1,-1};//總數(shù)是從0到9
/************************************************************************/
/*最大的值為:3
起點(diǎn) number[6]=1,終點(diǎn)number[8]=1
他們分別為:1 1 1
*/
/************************************************************************/
//inta[10]={2,-1,-1,-1,1,-1,1,1,1,-1};//總數(shù)是從0到9
/************************************************************************/
/*
最大的值為:-1
起點(diǎn) number[1]=-1,終點(diǎn) number[1]=-1
他們分別為:-1
Press any key to continue
*/
/************************************************************************/
int a[10]={-2,-1,-1,-1,-1,-1,-1,-1,-1,-1};//總數(shù)是從0到9
Find(a, 10);
return 0;
}
聯(lián)系客服