面试经典150题-8-买卖股票的最佳时机 II-力扣122

79 阅读1分钟

买卖股票的最佳时机 II-力扣122

难度:mid

题目描述

image.png

示例

image.png

解法1:动态规划

定义状态

dp[i][0]: 第i天操作后,不持股,所获得的最大利润

dp[i][1]: 第i天操作后,持股,所获得的最大利润

状态转移方程

dp[i][0]: 第i天有两种情况(第i天操作后,不持股)

  • 前一天操作结束后,还持有1支股票,第i天卖掉。
  • 前一天操作结束后,不持有股票,第i天也不买股票。
  • dp[i][0] = max(dp[i-1][1]+prices[i], dp[i-1][0])
    

dp[i][1]:第i天(第i天操作后,持股)

  • 前一天操作结束后,还持有1支股票,第i天不买股票
  • 前一天操作结束后,不持有股票,第i天买一支股票
  • dp[i][1] = max(dp[i-1][1], dp[i-1][0]-prices[i])
    

完整代码

int max(int a, int b){
    if(a>b) 
        return a;
    else 
        return b;
}
int maxProfit(int* prices, int pricesSize) {
    int dp[pricesSize][2];
    int i;

    // dp[i][0]: 第i天操作后,不持股,所获得的最大利润
    // dp[i][1]: 第i天操作后,持股,所获得的最大利润
    dp[0][0] = 0;
    dp[0][1] = -prices[0];
    for(i = 1; i < pricesSize; i ++){
        dp[i][0] = max(dp[i-1][1]+prices[i], dp[i-1][0]);
        dp[i][1] = max(dp[i-1][1], dp[i-1][0]-prices[i]);
    }

    return dp[pricesSize-1][0];
}

时间复杂度:O(n)O(n)

本来想写点详细过程的,但是感觉动态规划类的题目还是多做吧,做多了自然会。