【leetcode】40-best-time-to-buy-and-sell-stock 力扣 121. 買賣股票的最佳時機

買賣股票系列

【leetcode】40-best-time-to-buy-and-sell-stock 力扣 121. 買賣股票的最佳時機

【leetcode】41-best-time-to-buy-and-sell-stock-ii 力扣 122. 買賣股票的最佳時機 II

【leetcode】42-best-time-to-buy-and-sell-stock-iii 力扣 123. 買賣股票的最佳時機 III

【leetcode】43-best-time-to-buy-and-sell-stock-iv 力扣 188. 買賣股票的最佳時機 IV

【leetcode】44-best-time-to-buy-and-sell-stock-with-cooldown 力扣 309. 買賣股票的最佳時機包含冷凍期

【leetcode】45-best-time-to-buy-and-sell-stock-with-cooldown 力扣 714. 買賣股票的最佳時機包含手續(xù)費

開源地址

為了便于大家學(xué)習(xí)毙替,所有實現(xiàn)均已開源谦絮。歡迎 fork + star~

https://github.com/houbb/leetcode

121. 買賣股票的最佳時機

給定一個數(shù)組 prices 蹦肴,它的第 i 個元素 prices[i] 表示一支給定股票第 i 天的價格赂乐。

你只能選擇 某一天 買入這只股票惕澎,并選擇在 未來的某一個不同的日子 賣出該股票汁咏。

設(shè)計一個算法來計算你所能獲取的最大利潤哎壳。

返回你可以從這筆交易中獲取的最大利潤扎酷。如果你不能獲取任何利潤咏瑟,返回 0 拂到。

示例 1:

輸入:[7,1,5,3,6,4]
輸出:5
解釋:在第 2 天(股票價格 = 1)的時候買入,在第 5 天(股票價格 = 6)的時候賣出码泞,最大利潤 = 6-1 = 5 兄旬。
注意利潤不能是 7-1 = 6, 因為賣出價格需要大于買入價格;同時余寥,你不能在買入前賣出股票领铐。
示例 2:

輸入:prices = [7,6,4,3,1]
輸出:0
解釋:在這種情況下, 沒有交易完成, 所以最大利潤為 0。

提示:

1 <= prices.length <= 10^5
0 <= prices[i] <= 10^4

V1-暴力解法

    /**
     * 最簡單的暴力算法
     * @param prices 價格
     * @return 結(jié)果
     */
    public int maxProfit(int[] prices) {
        int maxResult = 0;

        for(int i = 0; i < prices.length-1; i++) {
            for(int j = i+1; j < prices.length; j++) {
                int profit = prices[j] - prices[i];
                maxResult =  Math.max(profit, maxResult);
            }
        }

        return maxResult;
    }

這種解法會超時宋舷。

v2-如何優(yōu)化呢绪撵?

核心的一點:最大的利潤,賣出之前則必須是買入的最小值祝蝠、賣出的最大值音诈。

所以只需要做幾件事:

0)最大值,最小值初始化為 prices[0];

1)記錄最大的利潤 maxResult = maxPrice - minPrice;

2)如果遇到了最小值绎狭,則重新初始化 minPrice, maxPrice

代碼實現(xiàn)

    public int maxProfit(int[] prices) {
        int maxResult = 0;
        int minVal = prices[0];
        int maxVal = prices[0];
        for(int i = 1; i < prices.length; i++) {
            int cur = prices[i];
            // 值大于當(dāng)前值
            if(cur > maxVal) {
                maxResult = Math.max(maxResult, cur - minVal);
            }
            // 重置
            if(cur < minVal) {
                minVal = cur;
                maxVal = cur;
            }
        }

        return maxResult;
    }

V2.5-代碼性能優(yōu)化

優(yōu)化思路

上面的分支判斷太多

核心實現(xiàn)

class Solution {

    public int maxProfit(int[] prices) {
        int maxResult = 0;
        int minVal = prices[0];
        for(int i = 0; i < prices.length; i++) {
            minVal = Math.min(minVal, prices[i]);
            maxResult = Math.max(prices[i] - minVal, maxResult);
        }

        return maxResult;
    }
    
}

效果

1ms 擊敗100.00%

V3-DP 的思路-貫穿整體解法

思路

我們一共完成了一筆完整的交易细溅,分為兩步:

  1. b1 買入1
  2. s1 賣出1

賣出+買入構(gòu)成了完整的交易。

每一天我們都可以決定是否買儡嘶,是否賣喇聊?

初始化

b1 買入時,我們初始化為 -prices[0];

s1 賣出時社付,初始化為0承疲;

代碼

public int maxProfit(int[] prices) {
    int b1 = -prices[0];
    int s1 = 0;

    for(int i = 0; i < prices.length; i++) {
        // 賣出第一筆 是否賣邻耕?  不賣則為s1, 賣出則為 b1 + prices[i]
        s1 = Math.max(s1, b1 + prices[i]);
        // 買入第一筆 是否買鸥咖?  如果買,則花費為當(dāng)前金額;
        b1 = Math.max(b1, - prices[i]);
    }
    return s1;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末兄世,一起剝皮案震驚了整個濱河市啼辣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌御滩,老刑警劉巖鸥拧,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件党远,死亡現(xiàn)場離奇詭異,居然都是意外死亡富弦,警方通過查閱死者的電腦和手機沟娱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來腕柜,“玉大人济似,你說我怎么就攤上這事≌电停” “怎么了砰蠢?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長唉铜。 經(jīng)常有香客問我台舱,道長,這世上最難降的妖魔是什么潭流? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任竞惋,我火速辦了婚禮,結(jié)果婚禮上灰嫉,老公的妹妹穿的比我還像新娘碰声。我一直安慰自己,他們只是感情好熬甫,可當(dāng)我...
    茶點故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布胰挑。 她就那樣靜靜地躺著,像睡著了一般椿肩。 火紅的嫁衣襯著肌膚如雪瞻颂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天郑象,我揣著相機與錄音贡这,去河邊找鬼。 笑死厂榛,一個胖子當(dāng)著我的面吹牛盖矫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播击奶,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼辈双,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了柜砾?” 一聲冷哼從身側(cè)響起湃望,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后证芭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瞳浦,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年废士,在試婚紗的時候發(fā)現(xiàn)自己被綠了叫潦。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,861評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡官硝,死狀恐怖诅挑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情泛源,我是刑警寧澤拔妥,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站达箍,受9級特大地震影響没龙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜缎玫,卻給世界環(huán)境...
    茶點故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一硬纤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧赃磨,春花似錦筝家、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至值骇,卻和暖如春莹菱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背吱瘩。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工道伟, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人使碾。 一個月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓蜜徽,卻偏偏與公主長得像,于是被迫代替她去往敵國和親票摇。 傳聞我的和親對象是個殘疾皇子拘鞋,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,860評論 2 361

推薦閱讀更多精彩內(nèi)容