給定一個(gè)數(shù)組 prices ,它的第 i 個(gè)元素 prices[i] 表示一支給定股票第 i 天的價(jià)格。
你只能選擇 某一天 買(mǎi)入這只股票,并選擇在 未來(lái)的某一個(gè)不同的日子 賣(mài)出該股票。設(shè)計(jì)一個(gè)算法來(lái)計(jì)算你所能獲取的最大利潤(rùn)。
返回你可以從這筆交易中獲取的最大利潤(rùn)。如果你不能獲取任何利潤(rùn),返回 0 。
摘一個(gè)示例做個(gè)說(shuō)明.
示例 1:
輸入:[7,1,5,3,6,4]
輸出:5
解釋?zhuān)涸诘?2 天(股票價(jià)格 = 1)的時(shí)候買(mǎi)入,在第 5 天(股票價(jià)格 = 6)的時(shí)候賣(mài)出,最大利潤(rùn) = 6-1 = 5 。
注意利潤(rùn)不能是 7-1 = 6, 因?yàn)橘u(mài)出價(jià)格需要大于買(mǎi)入價(jià)格;同時(shí),你不能在買(mǎi)入前賣(mài)出股票。
條件分析:
- 在某一天買(mǎi),在未來(lái)某一天賣(mài) -> 只能買(mǎi)賣(mài)一次,不存在頻繁買(mǎi)賣(mài)
- 最大利潤(rùn) -> 找出買(mǎi)賣(mài)后最大的利潤(rùn)值即可
解決思路1:
- 根據(jù)分析1,說(shuō)明需要買(mǎi)賣(mài)一次
- 根據(jù)分析2,可以找出每天買(mǎi)賣(mài)的收益進(jìn)行對(duì)比
計(jì)算每天持有和不持有的收益,然后循環(huán)最大值,最后輸出不持有時(shí)候的收益(因?yàn)樾枰u(mài)出才能收益,所以最后肯定是不持有狀態(tài)).
func maxProfit(_ prices: [Int]) -> Int {
if prices.count == 1 {
return 0
}
// 第一天不持有和持有的收益
var maxProfit0 = 0 ,maxProfit1 = -prices[0]
for i in 0 ..< prices.count {
// 第i天不持有和持有的收益
maxProfit0 = max(maxProfit0, maxProfit1 + prices[i])
maxProfit1 = max(maxProfit1, -prices[i])
}
// 最后需要賣(mài)出,所以是不持有
return maxProfit0
}

買(mǎi)賣(mài)股票的最佳時(shí)機(jī)提交結(jié)果.jpg
測(cè)試用例:
// 最小值
let nums = [0]
let nums = [1]
// 批量正常數(shù)據(jù)
let nums = [1,1,24,5,6,67,7]
let nums = [1,9,1,24,5,6,67,7]
let nums = [1,1,9,1,24,5,24,5,6,67,7]
let nums = [9,1,24,5,1,1,24,5,6,67,7]
let nums = [400,1,24,5,6,67,79,1,24,5,]
考察要點(diǎn):
- 數(shù)組
- 動(dòng)態(tài)規(guī)劃