1. 程式人生 > 其它 >劍指offer(63)

劍指offer(63)

劍指offer(63)

劍指 Offer 63. 股票的最大利潤

假設把某股票的價格按照時間先後順序儲存在陣列中,請問買賣該股票一次可能獲得的最大利潤是多少?

示例 1:

輸入: [7,1,5,3,6,4]
輸出: 5
解釋: 在第 2 天(股票價格 = 1)的時候買入,在第 5 天(股票價格 = 6)的時候賣出,最大利潤 = 6-1 = 5 。
     注意利潤不能是 7-1 = 6, 因為賣出價格需要大於買入價格。

示例 2:

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

限制:

0 <= 陣列長度 <= 10^5

經典的股票買賣動態規劃問題。

多看一個方法團滅 LeetCode 股票買賣問題 :: labuladong的演算法小抄

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        //經典股票動態規劃問題 dp[i][j]  i代表第幾天 j代表是否手上有股票 
        //dp[i][1]=max(dp[i-1][0]-prices[i],dp[i-1][1]);//如果第i天手上有股票 那麼就只可能是今天才買 或者昨天買了沒動
        //dp[i][0]=max(dp[i-1][1]+pricies[i],dp[i-1][0]);//如果i天手上沒有股票 要麼是今天賣了 要麼是昨天手上也沒有
        //發現本題只與前一天手上有沒有股票有關係 所以可以進行空間複雜度的優化
        //用dp[i]記錄i天內的最大利潤 
        int n=prices.size();
        int dp_i_0=0;//記錄第i天手上沒有股票
        int dp_i_1=INT_MIN;//記錄第i天手上持有股票 因為求最大利潤 所以記為INT_MIN;
        for(int i=0;i<n;i++){
            // dp[i][0] = max(dp[i-1][0], dp[i-1][1] + prices[i])
            dp_i_0=max(dp_i_1+prices[i],dp_i_0);
            // dp[i][1] = max(dp[i-1][1], -prices[i])
            dp_i_1=max(-prices[i],dp_i_1);
        }
        //為什麼不返回dp_i_1因為要求的是最大利潤 如果最後一天手上還有股票肯定利潤不如手上沒有股票
        return  dp_i_0;
    }
};