[算法导论]练习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;

}    

 

posted @ 2015-02-10 13:56  TimCheng  阅读(1348)  评论(0编辑  收藏  举报