初級(jí)算法-動(dòng)態(tài)規(guī)劃-買(mǎi)賣(mài)股票的最佳時(shí)機(jī)

給定一個(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)出股票。
條件分析:
  1. 在某一天買(mǎi),在未來(lái)某一天賣(mài) -> 只能買(mǎi)賣(mài)一次,不存在頻繁買(mǎi)賣(mài)
  2. 最大利潤(rùn) -> 找出買(mǎi)賣(mài)后最大的利潤(rùn)值即可
解決思路1:
  1. 根據(jù)分析1,說(shuō)明需要買(mǎi)賣(mài)一次
  2. 根據(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ī)劃
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容