有一個數組集合 [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; //出現更大的數, 記錄下來
}
這樣能得到最大的值, 其次, 就是獲取區間范圍. 這個就是記錄方法了. 我就不在此描述了