給定一個(gè)數(shù)組之景,它的第?i 個(gè)元素是一支給定股票第 i 天的價(jià)格逆屡。
如果你最多只允許完成一筆交易(即買入和賣出一支股票一次)植兰,設(shè)計(jì)一個(gè)算法來(lái)計(jì)算你所能獲取的最大利潤(rùn)焚挠。
注意:你不能在買入股票前賣出股票万俗。
示例 1:
輸入: [7,1,5,3,6,4]
輸出: 5
解釋: 在第 2 天(股票價(jià)格 = 1)的時(shí)候買入湾笛,在第 5 天(股票價(jià)格 = 6)的時(shí)候賣出,最大利潤(rùn) = 6-1 = 5 闰歪。
? ? 注意利潤(rùn)不能是 7-1 = 6, 因?yàn)橘u出價(jià)格需要大于買入價(jià)格嚎研;同時(shí),你不能在買入前賣出股票库倘。
示例 2:
輸入: [7,6,4,3,1]
輸出: 0
解釋: 在這種情況下, 沒(méi)有交易完成, 所以最大利潤(rùn)為 0临扮。
思路1:
貪心算法,每次找到后面的最大值教翩,減去當(dāng)前值杆勇,再和歷史最大值比較
max1=0
????????for?i?in?range(len(prices)):
????????????tmp=max(prices[i:])
????????????if?tmp>prices[i]:
????????????????????max2=tmp-prices[i]
????????????????????if?max2>max1:
????????????????????????max1=max2
????????return?max1
思路2:
動(dòng)態(tài)規(guī)劃算法,每次找到最小值饱亿,用當(dāng)前值減去最小值蚜退,最后更新到最大值上,耗時(shí)比上面小
max1=0
????????min1=prices[0]
????????for?i?in?range(1,len(prices)):
????????????max1=max(max1,prices[i]-min1)
????????????min1=min(min1,prices[i])
????????return?max1