思考算法題 之集合內最大區間值

有一個數組集合 [3, 1, -2, 4, 6, -4, -2, -7, 5, 6, -3, 2]

希望能求得集合內某個范圍 下標N~M的最大值可能是多少.?

在實際生活中可能遇到這個情況之一的是股票,?

某月 1號, 股價上漲3塊.?

2號, 股價上漲1塊.

3號, 股價下跌2塊.

4號, 股價上漲4塊.

5號, 股價上漲6塊.

6號, 股價下跌4塊.

7號, 股價下跌2塊.

8號, 股價下跌7塊.

9號, 股價上漲5塊.

10號, 股價上漲6塊.

11號, 股價下跌3塊.

12號, 股價上漲2塊.?

想知道這13天, 只進行一次買賣的話. 哪天買入, 哪天賣出. 可以獲得最大收益.

然后來分析一下這個情況, 第一天賺了3, 第二天又賺了1, 那么這時, 我總共賺了4. 第三天, 雖然跌了2, 但是我實際上, 還是賺了2. 第四天, 又賺了4, 這時總共賺了6了. 雖然中途有下跌, 但是下跌的數值, 跟第一二天上漲的數值比, 還是小于的, 所以還是多賺了2塊. 第五天, 又賺了6塊, 這時. 總共賺了12塊了. 第六天, 下跌了4, (+8). 第七天, 下跌2, (+6). 第八天, 下跌7, (-1).此時, 開始虧錢了. 那么, 總第八開始, 前面的日期. 總的來說, 是虧錢的. 就不計算在內了, 需要重新計算.

依據前幾天的情況, 一直到第八天才虧光. 但是這8天里, 賺到的最大值, 是12. 那么從 第一天, 到第5天. 是前8天的最大范圍.

第九天, 賺了5 (+5). 第十天, 賺了6 (+11). 第十一天, 虧了3(+8). 第十二天, 賺了2 (+10).

由此看到第九天 到 第十天, 一度賺到了11, 是最大值. 并且大于前8天的最大值8. 所以. 第九,十兩天賺到是最大值.


如何計算呢

這個最大值的范圍, 一定是從一個正數, 到另一個正數的范圍. 因為負數是減嘛, 如果一開始就減, 那就沒有必要了. 所以首先我們 循環整個數組尋找第一個正數, 找到之后, 記錄下標和總和. 然后加上后一個數, 如果總和大于0, 說明總體是上漲的. 如果小于0. 那么是下跌了, 就不要了, 并且初始化記錄, 重新開始. 以此往復.

在記錄的時候呢, 記錄了總和, 用來判斷總體是不是大于0, 是否有必要帶著前面的集合. 并且, 要同時記錄最大值.

int max = 0; 最大值

int count = 0; 總和

count += ary[i]; 數值相加, 看看是否大于0

if ( count > max ){

? ? max = count; //出現更大的數, 記錄下來

}

這樣能得到最大的值, 其次, 就是獲取區間范圍. 這個就是記錄方法了. 我就不在此描述了

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容