亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

求最大連續子數列和(只掃描一次數列)

系統 1761 0

一、什么是求最大連續子數列和

首先來看看這是個怎樣的問題的,問題描述:一個整型數組,數組里有正數也有負數。數組中連續的一個或多個整數組成一個子數組,每個子數組都有一個和,求所有子數組的和的最大值。注意:當全是負數的情況時,返回最大的那個負數


二、解題思路

這個問題的思路其實非常簡單,從左到右掃描數組,在掃描過程中,記錄數組的負數的個數和掃描過中數據中的最大值,并累加每個掃描到的數據的和,假設用變量thisSum(初值為0)保存,如果當前的累加值大于之前的累加值的最大值 (例如用變量sum記錄,初值為0),則把當前的最大值保存為最大值(sum = thisSum),如果thisSum小于0,則把thisSum設置為0并重新進行累加。一直這樣掃描數組,直到把數組掃描完。


由于thisSum已經小于0,也就是說之前統計的和可以舍棄,因為把當前的元素累加之后,結果反而小了。例如把數組分成兩部分AB,因為A的值小于0,所以如果從B開始從新累加,則其值一定比包括A然后去累加B的結果大,因為A小于0.


由于如果數組全是負數時,要返回最大的負數,而從上面所說的說法中,我們可以看到當前累加總和(thisSum)總是與0進行比較,如果小于0則把thisSum置為0,所以當數組全是負數時,thisSum和數組的最大子序列之和(sum)總是為0,而與現實有點不一樣,所以就要記錄負數的數量,當負數的數量等于元素的個數(即全是負數)時,就要把最大連續子序列和置為最大的負數。這也是前面所說的,在掃描過程中記錄負數的個數和最大元素的作用。


三、實現代碼

?

    int MaxSum(int* a,int n)

{

    int sum = 0; //用于記錄最大的連續子數組和

    int flag = 0;//用于記錄負數的個數

    int MaxNum = *a;//用于記錄數組中最大的數

    int ThisSum = 0;//用于記錄當前的連續子數組和

    for(int i = 0; i < n; ++i)

    {

        if(a[i] < 0) //如果無素為負數,則把flag的值加1

            ++flag;

        if(MaxNum < a[i]) //記錄數組當前的最大值

            MaxNum = a[i];

        ThisSum += a[i]; //累加更新當前的子數組之和

        if(ThisSum > sum)

        {

            //若當前連續子數組之和大于記錄的子數組之和

            //則設置最大連續子數組之和為當前的和

            sum = ThisSum;

        }

        else if(ThisSum < 0)

        {

            //如果當前連續子數組之和小于0,則拋棄之前的連續子數組,

            //從此元素的下一個元素重新計算連續子數組之和

            ThisSum = 0;

        }

    }

    //若全是負數,最大值為數組中的最大無素

    if(flag == n)

        sum = MaxNum;

    return sum;

}
  

我們再來看看測試結果吧,測試代碼如下:

?

?

    int main()

{

    int a[100] = {1, -2, 3, 10, -4, 7, 2, -5};

    cout<<MaxSum(a,8)<<endl;

    return 0;

}
  

運行結果如下:

?

求最大連續子數列和(只掃描一次數列)

從運行結果和測試數據來看,最大的連續子數組應該是3,10,-4,7,2.它們的和就為18.


四、時間復雜度和空間復雜度分析

從代碼和上面的解說可以看到,這個算法的時間復雜度只為O(N),而且常數為1,即只需要掃描一次數組即可完成任務。而且用到的輔助空間也非常少,只有四個變量,空間復雜度為O(1)。


五、完整代碼代碼下載地址:

https://github.com/ljianhui/Arithmetic

文件名: max_sum_of_continuous_sub_array.cpp

?

求最大連續子數列和(只掃描一次數列)


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 6一10周岁毛片在线 717影院理论午夜伦八戒 | 中文字幕一区二区精品区 | 狠狠干艹 | 国内精品伊人久久久影院 | 高清不卡一区二区 | 久久国产影院 | 国产亚洲欧美在在线人成 | 伊人久久中文字幕 | 久久九九有精品国产23百花影院 | 欧美123| 亚洲无卡视频 | 国产农村妇女毛片精品久久 | 一级网 | 偷偷鲁影院手机在线观看 | 日韩欧美在线综合网高清 | 久久狠狠婷婷丁香香蕉 | 精品久久久久国产免费 | 日韩女人做爰大片 | 高清国产美女一级a毛片录 高清国产美女一级毛片 | 成人a视频片在线观看免费 成人a视频在线观看 | 国产精品久久久久尤物 | 亚洲精品影院一区二区 | 337p亚洲精品色噜噜狠狠 | 国产91成人 | 99热在这里只有精品 | 国产乱码精品一区二区 | 国产福利视频一区 | 桃花阁成人网在线观看 | 特级毛片免费视频播放 | 国产毛片视频网站 | 免费精品美女久久久久久久久久 | 国产深夜福利视频观看 | 亚洲精品一二三四 | 好吊色青青青国产欧美日韩 | 欧美高清性刺激毛片 | 老司机深夜影院入口aaaa | 日本高清h色视频在线观看 日本高清不卡二区 | 好吊妞欧美视频免费 | 久久成人免费观看草草影院 | 精品一成人岛国片在线观看 | 狠狠干影视 |