算法:买卖股票最佳时机(c++)
買賣股票相關問題:
1,只能買賣一次:
假設有一個數組,它的第i個元素是一支給定的股票在第i天的價格。 如果你最多只允許完成一次交易,設計一個算法來找出最大利潤。例如:[3,4,5,1,9] 輸出:8 解釋:第四天買入,第五天賣出原理:為了減少復雜度,這里用峰谷的方法遍歷
在第一個不虧損的日子買入,然后比較,如果后一天不賣是虧損還是接著賺。
虧損就放棄這一段,從下一個日子開始繼續分析
接著賺就不放棄。
【說實話我覺著難點在怎么記這個開始和結束的日子,我還試了一下,挺麻煩的】
c++實現代碼如下:
2,可以無限次買賣
【其實這個在第三個,但我覺著它比第三個簡單點……甚至比第一個簡單】
原理非常簡單:比較相鄰兩次的值,能賺就買,會虧就不買
代碼如下:
3,只限兩次買賣:
給定一個數組,它的第 i 個元素是一支給定的股票在第 i 天的價格。設計一個算法來計算你所能獲取的最大利潤。你最多可以完成 兩筆 交易。注意: 你不能同時參與多筆交易(你必須在再次購買前出售掉之前的股票)。示例 1:輸入: [3,3,5,0,0,3,1,4] 輸出: 6 解釋: 在第 4 天(股票價格 = 0)的時候買入,在第 6 天(股票價格 = 3)的時候賣出,這筆交易所能獲得利潤 = 3-0 = 3 。 隨后,在第 7 天(股票價格 = 1)的時候買入,在第 8 天 (股票價格 = 4)的時候賣出,這筆交易所能獲得利潤 = 4-1 = 3 。這部分借鑒的這篇文章:https://blog.csdn.net/lzz_zz/article/details/102860884
看這段的時候滿腦子,媽媽這段代碼好牛逼……
嗯……把大佬的思路展開一下!
【為了做這題我還去撿了一下動態規劃】
簡單的說,其實可以把兩次買賣規劃成這樣:
第一天:買/賣/維持
第二天:買/賣/維持
……
每個結點有自己的值(股票價格)
其實就是一個四層的樹
不過也有特別的地方,比如如果第一天沒買,第二天就不可能賣,不過這點我們后說。
把每個結點動態規劃出來:
【前面是不操作,后面是操作】
s1[i] = max(s1[i-1],-price)
s2[i] = max(s2[i-1],s1[i-1]+price)
s3[i] = max(s3[i-1],s2[i-1]-price)
s4[i] = max(s4[i-1],s3[i-1]+price)
動態規劃是一種自底向上的結構——但是這里的循環排序是s4,s3,s2,s1這樣的,為什么呢?
因為,開始時設定的s1為負無窮,s3為負無窮,這樣在位置為1的時候前三者都處于極限狀態,只有s1能夠獲得實際數值——而s1能影響下個位置的s2,事實上,這還是從s1往上討論的。
而s2的判斷方式和第一問,一次買賣的想法類似。
實現代碼如下:
總結
以上是生活随笔為你收集整理的算法:买卖股票最佳时机(c++)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 下载android版本公信宝,【公信宝A
- 下一篇: JSON for Modern C++