题目:在线性时间内非递归的求数组的最大连续子数组(连续和最大的子数组)。
思路:设最大子数组的和为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; }
时间: 2024-10-11 01:50:37