[算法导论]练习4.1-5最大连续子数组问题
转载请注明:http://www.cnblogs.com/StartoverX/p/4283720.html
题目:在线性时间内非递归的求数组的最大连续子数组(连续和最大的子数组)。
思路:设最大子数组的和为max,起点和终点位置为s、e,正在扫描的子数组的和为add,起点和终点位置为i、j。max的初始值为-∞。
1.若数组的值全为负,则返回最大值。
2.逐个扫描数组元素,更新add、i、j的值。
a.若add的值为正,则和max的值比较,如果大于max的值,更新max、s、e的值为add、i、j。
b.若add的值为负,则从i到j这一段的数字只能减少子数组的和,要丢弃,add值清零并重下一个元素重新开始计算,更新i、j的值。
#include<iostream>
using namespace std;
int A[100];
int main(){
int size;
cin>>size;
bool neg_flag=true;//当全为负数时返回最大值。
int neg_max=-1e10;
for(int i=0;i<size;i++){//输入并判断是否全为负。
cin>>A[i];
if(A[i]>=0){
neg_flag=false;
}
if(A[i]>neg_max){
neg_max=A[i];
}
}
if(neg_flag==true){
cout<<"max is "<<neg_max<<" start from "<<neg_max<<" to "<<neg_max<<endl;
return 0;
}
int max=-1e10;//最大和。
int s=-1;//最大子数组起点。
int e=-1;//最大子数组终点。
int add=0;//扫描子数组和。
int i=0;//扫描子数组起点。
int j=0;//扫描子数组终点。
while(j<size){
add+=A[j];
if(add>=0){
if(add>=max){
max=add;
s=i;
e=j;
}
++j;
}
else{
++j;
i=j;
if(j<size){
add=0;
}
}
}
cout<<"max is "<<max<<" start from "<<A[s]<<" to "<<A[e]<<endl;
}