国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

算法刷題|121.買賣股票的最佳時機、122.買賣股票的最佳時機Ⅱ

這篇具有很好參考價值的文章主要介紹了算法刷題|121.買賣股票的最佳時機、122.買賣股票的最佳時機Ⅱ。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

買賣股票的最佳時機

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

你只能選擇 某一天 買入這只股票,并選擇在 未來的某一個不同的日子 賣出該股票。設計一個算法來計算你所能獲取的最大利潤。

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

  • dp[i][0]表示第i天不持有股票的最大利潤;dp[i][1]表示第i天持有股票的最大利潤
  • 遞推公式
    • 第i天不持有股票:dp[i][0] = Math.max(dp[i-1][0],dp[i-1][1]+prices[i]
      • 昨天本來就不持有:dp[i-1][0]
      • 昨天持有,但是今天賣了,所有今天也就不持有了:dp[i-1][1]+prices[i]
    • 第i天持有股票:dp[i][1] = Math.max(dp[i-1][1],0-prices[i])
      • 昨天本來就持有:dp[i-1][1]
      • 昨天本來沒有,今天買了,就持有了,因為只能買賣一次,所有買的時候手里的利潤一定是0:0-prices[i])
  • dp數(shù)組初始化:dp[0][0] = 0,dp[0][1] = -prices[0]
  • 遍歷順序:從小到大
  • 打印dp數(shù)組
class Solution {
    public int maxProfit(int[] prices) {
        // dp[i][0]表示第i天不持有股票的最大利潤,dp[i][1]表示第i天持有股票的最大利潤
        int[][] dp = new int[prices.length][2];
        // 初始化
        dp[0][0] = 0;
        // 持有股票,就要買入股票,利潤肯定暫時是負數(shù)
        dp[0][1] = -prices[0];
        for(int i = 1;i<prices.length;i++){
            // 第i天不持有股票
            dp[i][0] = Math.max(dp[i-1][0],dp[i-1][1]+prices[i]);
            // 第i天持有股票
            dp[i][1] = Math.max(dp[i-1][1],-prices[i]);
        }
        return dp[prices.length - 1][0];
    }
}

通過遞推公式可以發(fā)現(xiàn),當前第i天的是否持有股票只是和前一天有關系,所有我們可以使用兩個變量來存儲

class Solution {
    public int maxProfit(int[] prices) {
        // 初始化
        // 第0天不持有股票
        int dp_i_0 = 0;
        // 第0天持有股票
        int dp_i_1 = -prices[0];
        // 因為當前的天是否持有股票只和相鄰的天有關系,所有我們可以采用兩個變量存儲,類似斐波那契數(shù)列的空間復雜度為O(1)的處理
        for(int i = 1;i<prices.length;i++){
            dp_i_0 = Math.max(dp_i_0,dp_i_1+prices[i]);
            dp_i_1 = Math.max(dp_i_1,-prices[i]);
        }
        return dp_i_0;
    }
}

買賣股票的最佳時機Ⅱ

題目:給你一個整數(shù)數(shù)組 prices ,其中 prices[i] 表示某支股票第 i 天的價格。

在每一天,你可以決定是否購買和/或出售股票。你在任何時候 最多 只能持有 一股 股票。你也可以先購買,然后在 同一天 出售。

返回 你能獲得的 最大 利潤 。

思路:和買賣股票1的區(qū)別就是買賣股票1買入的時候手里的利潤一定是0,而本題可以多次買入所有買入股票的時候手里的利潤就不一定是0

class Solution {
    public int maxProfit(int[] prices) {
        int[][] dp = new int[prices.length][2];
        dp[0][0] = 0;
        dp[0][1] = -prices[0];
        for(int i = 1;i<prices.length;i++){
            dp[i][0] = Math.max(dp[i-1][0],dp[i-1][1] + prices[i]);
            // 因為可以多次買賣股票,所有這里手里的利潤就不一定是0了,所以最大金額就要使用之前的利潤減輕今天的股票價格
            dp[i][1] = Math.max(dp[i-1][1],dp[i-1][0] - prices[i]);
        }
        return dp[prices.length - 1][0];
    }
}

空間優(yōu)化文章來源地址http://www.zghlxwxcb.cn/news/detail-425618.html

class Solution {
    public int maxProfit(int[] prices) {
        int dp_i_0 = 0;
        int dp_i_1 = -prices[0];
        for(int i = 1;i<prices.length;i++){
            // 因為先計算的dp_i_0,所有計算dp_i_1的時候dp_i_0已經(jīng)發(fā)生變化了,所有使用temp記錄一下值
            int temp = dp_i_0;
            dp_i_0 = Math.max(dp_i_0,dp_i_1+prices[i]);
            dp_i_1 = Math.max(dp_i_1,temp-prices[i]);
        }
        return dp_i_0;
    }
}

到了這里,關于算法刷題|121.買賣股票的最佳時機、122.買賣股票的最佳時機Ⅱ的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 121. 買賣股票的最佳時機

    121. 買賣股票的最佳時機

    121. 買賣股票的最佳時機 https://leetcode.cn/problems/best-time-to-buy-and-sell-stock/description/

    2024年02月19日
    瀏覽(21)
  • 買賣股票的最佳時機【力扣121】

    假如我們要在第 i 天賣出股票,那么為了獲得最大利潤,買股票的最佳時間是第 i 天前的最低股價的那一天。 我們使用min來記錄已經(jīng)訪問過的 0-i 天的最低股價。那么在第 i 天,如果股價大于min,那么最大利潤為price[i]-min;否則最大利潤為0,并且min=price[i]。

    2024年02月11日
    瀏覽(24)
  • 力扣 121. 買賣股票的最佳時機

    力扣 121. 買賣股票的最佳時機

    題目來源:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock/description/ 好久沒寫代碼了,啥啥都忘了 C++題解1:貪心算法。(來源代碼隨想錄) 因為股票就買賣一次,那么貪心的想法很自然就是取最左最小值,取最右最大值,那么得到的差值就是最大利潤。 時間復雜度:O(n) 空

    2024年02月20日
    瀏覽(22)
  • 122. 買賣股票的最佳時機 II

    ??兩題的本質(zhì)是一樣的,只不過含手續(xù)費多了一個手續(xù)費,手續(xù)費可以在買的時候一并扣掉就行。 ??這兩題的關鍵在于到理解dp數(shù)組創(chuàng)建的意義,這兩題dp數(shù)組創(chuàng)建的意義為 到今天為止,持有狀態(tài)和未持有狀態(tài)的最優(yōu)情況 ,dp[i]就可以根據(jù)dp[i-1]也推出最優(yōu)情況,只需要考

    2024年02月15日
    瀏覽(22)
  • leetcode 121. 買賣股票的最佳時機

    leetcode 121. 買賣股票的最佳時機

    ? ? ? ? ?本題用dp算法做, dp[i]的含義:前 i+1天能獲得的最大利潤 。 然后每次循環(huán)時需要維護一個最小值 min_num?:即 i+1天中股票的最低價 。剩下的步驟都很常規(guī),代碼如下: ? ? ? ? dp[i][0]:第i天持有股票所擁有的最多現(xiàn)金。? ? ? ? ? dp[i][1]:第i天不持有股票所擁有的最

    2024年02月12日
    瀏覽(20)
  • leetcode121. 買賣股票的最佳時機

    leetcode121. 買賣股票的最佳時機

    題目: 給定一個數(shù)組? prices ?,它的第? i ?個元素? prices[i] ?表示一支給定股票第? i ?天的價格。 你只能選擇? 某一天 ?買入這只股票,并選擇在? 未來的某一個不同的日子 ?賣出該股票。設計一個算法來計算你所能獲取的最大利潤。 返回你可以從這筆交易中獲取的最大

    2024年02月10日
    瀏覽(23)
  • 【LeetCode】121.買賣股票的最佳時機

    給定一個數(shù)組? prices ?,它的第? i ?個元素? prices[i] ?表示一支給定股票第? i ?天的價格。 你只能選擇? 某一天 ?買入這只股票,并選擇在? 未來的某一個不同的日子 ?賣出該股票。設計一個算法來計算你所能獲取的最大利潤。 返回你可以從這筆交易中獲取的最大利潤。如

    2024年02月15日
    瀏覽(23)
  • 力扣122. 買賣股票的最佳時機 II

    思路: 假設 dp[i][0] 是第 i 天手上沒有股票時的最大利潤, dp[i][1] 是第 i 天手上有 1 支股票的最大利潤; dp[i][0] 的遷移狀態(tài)為: dp[i - 1][0],前一天手上已經(jīng)沒有股票,沒有發(fā)生交易; dp[i - 1][1] + prices[i],前一天手上有 1 支股票,第 i 天將其賣掉獲得收益 prices[i]; 所以,

    2024年02月03日
    瀏覽(20)
  • [思維]LeetCode:121.買賣股票的最佳時機

    [思維]LeetCode:121.買賣股票的最佳時機

    ? 題目鏈接:121. 買賣股票的最佳時機 - 力扣(Leetcode) ? 分析:這里的數(shù)據(jù)大小為1e5,所以使用暴力會TLE. 思路:我們發(fā)現(xiàn), 需要找到最大利潤,其目標就是找到當前第i位后的最大值。換位思考,就是找到當前第i位前的最小值。

    2023年04月09日
    瀏覽(29)
  • 力扣(Leetcode) 121. 買賣股票的最佳時機

    力扣(Leetcode) 121. 買賣股票的最佳時機

    給定一個數(shù)組? prices ?,它的第? i ?個元素? prices[i] ?表示一支給定股票第? i ?天的價格。 你只能選擇? 某一天 ?買入這只股票,并選擇在? 未來的某一個不同的日子 ?賣出該股票。設計一個算法來計算你所能獲取的最大利潤。 返回你可以從這筆交易中獲取的最大利潤。如

    2024年01月25日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包