2022-09-27 【我的刷題日記】121買賣股票的最佳時機

思路:本題的意圖還是非常好理解的,就是要求一個數(shù)組中,后減去前的最大正數(shù)差值,很自然我們可以想到用雙重for循環(huán)進行遍歷加上計數(shù)器記錄最大差值,時間復雜度為n的平方,很自然就超時了

       // 暴力超時
        int result = 0;
        for (int i = 0; i < prices.length; i++) {
            for (int j = i+1; j < prices.length; j++) {
                    result = Math.max(result,prices[j] - prices[i]);
            }
        }
        return result;

所以再次回到了用動態(tài)規(guī)劃解決的思路,首先先確定dp數(shù)組的意義,本題數(shù)組的索引代表了天數(shù),而每天也會有兩種狀態(tài)(持有股票和不持有股票),所以我們 的dp數(shù)組也應該是二維的dp[i][0/1],第一維表示天數(shù),第二維表示是否持有股票,dp[i][0/1]就表示第i天持有或者不持有股票的最大金額。
那么對于dp[i][0]而言 第i天是持有股票狀態(tài),那么當前狀態(tài)可能是因為上一天就已經(jīng)持有股票即dp[i-1][0],也可能是因為今天才剛剛買入股票那么對應的金額就是-prices[i].
而對于dp[i][1],第i天不持有股票,可能是因為上一天就沒有股票dp[i-1][1],也可能是因為今天才剛剛賣出股票即dp[i-1][0] + prices[i].
那么我們已經(jīng)理清的遍歷過程和遞推過程,dp數(shù)組的初始化就很明顯應該初始化dp[0][0] = -prices[0]和dp[0][1] = 0;

class Solution {
    public int maxProfit(int[] prices) {
if (prices.length == 0 || prices == null) return 0;
        int[][] dp = new int[prices.length][2];
        dp[0][0] = -prices[0];
        dp[0][1] = 0;
        for (int i = 1; i < prices.length; i++) {
//            持有股票(前一天就持有或者今天才買入 選一個最大)
            dp[i][0] = Math.max(dp[i-1][0],-prices[i]);
//            不持有(前一天就不持有或者今天才賣出 選最大的)
            dp[i][1] = Math.max(dp[i-1][1],dp[i-1][0] + prices[i]);
        }
        return dp[prices.length -1][1];

    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

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

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