Tencent 48-株IIを売買するのに最適な時期
配列が与えられた場合、i番目の要素は特定の株式のi日目の価格です。
得ることができる最大の利益を計算するアルゴリズムを設計します。できるだけ多くのトランザクションを完了することができます(株を複数回購入)。
注:複数の取引に同時に参加することはできません(前の株を売ってから再度購入する必要があります)。
例1:
入力:[7,1,5,3,6,4]
出力:7
説明:2日目に購入(株価= 1)、3日目に売り(株価= 5)、この交換により、利益が得られます= 5-1 = 4。
次に、4日目に購入し(株価= 3)、5日目に販売すると(株価= 6)、取引所は利益を得ることができます= 6-3 = 3。
例2:
入力:[1,2,3,4,5]
出力:4
説明:1日目に購入(株価= 1)、5日目に販売(株価= 5)、この合計交換は利益を得ることができます= 5-1 = 4。
1日目に次々と株を購入し、後で売却することはできません。
これは同時に複数の取引に関与するため、再度購入する前に以前の株を売却する必要があります。
例3:
入力:[7,6,4,3,1]
出力:0
説明:この場合、トランザクションは完了していないため、最大利益は0です。
- 複数回取引できますが、各トランザクションは販売前に購入されます
- 貪欲なアイデアでは、トラフとクレストを探すたびに、隣接する2つのトラフとクレストがトランザクションとして使用され、収入が蓄積されます
- 注意すべきことの1つは境界条件です。すべての判断は等号を使用します。これは無効な販売シグナルにつながる可能性があり、price_buy_flag購入シグナルの有効性によって解決する必要があります。つまり、販売前に有効な購入シグナルが必要です。
- それ以外の場合、[5、2、3、6、6、2、9、10、7、4、5、0]の6のうちの2つが売りシグナルと見なされます。
class Solution:
def maxProfit(self, prices: List[int]) -> int:
##可以多次交易,但每次交易仍是先买后卖的
##用贪心的思路,每次寻找波谷和波峰,相邻两次波谷和波峰作为一次交易,累加收入
##注意的一个是边界条件,判断时全用了带等号的,这就可能导致出现无效的卖信号,需要通过一个price_buy_flag买信号的有效性来解决,即在卖之前必须有有效的买信号
##否则对【5,2,3,6,6,2,9,10,7,4,5,0】其中的两个6都会认为是卖信号
# if len(prices)==0 or len(prices)==1:return 0
# else:
# res=0
# price_buy_flag=False
# for i in range(0,len(prices)):
# if (i!=0 and i!=len(prices)-1 and prices[i-1]>=prices[i] and prices[i+1]>=prices[i]) or (i==0 and prices[i+1]>=prices[i]) :
# price_buy=prices[i]
# price_buy_flag=True
# if (i!=0 and i!=len(prices)-1 and prices[i-1]<=prices[i] and prices[i+1]<=prices[i]) or (i==len(prices)-1 and prices[i-1]<=prices[i]):
# price_sale=prices[i]
# res+=price_sale-price_buy if price_buy_flag else 0
# price_buy_flag=False
# return res
maxprofit = 0
for i in range(1,len(prices)):
if (prices[i] > prices[i - 1]):
maxprofit += prices[i] - prices[i - 1]
return maxprofit
##原来波峰波谷之间的差值可以直接用连续的两两差值来累加