面试经典150题-7- 买卖股票的最佳时机-力扣121

89 阅读1分钟

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

难度:eassy

题目描述

image.png

示例

image.png

暴力肯定会超时,想都别想了

解法1:一遍过

int maxProfit(int* prices, int pricesSize) {
    int min=prices[0], max=0;
    int i;
    for(i=0; i < pricesSize; i ++){
        if(prices[i] < min){
            min = prices[i];
        }else{
            if((prices[i]-min) > max) 
                max=prices[i]-min;
        }
    }
    return max;
}

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

解法2:动态规划

dp[i][0]:表示第0~i天内买股票最便宜价格

dp[i][1]:表示第0~i天内卖出股票能获得的最大利润

dp数组记录的均是一段时间内状态的最值

int maxProfit(int* prices, int pricesSize) {
    // 动态规划写法
    int dp[pricesSize][2];
    int i, j;

    // dp[i][0] 表示第0~i天内买股票最便宜价格
    // dp[i][1] 表示第0~i天内卖出股票能获得的最大利润
    
    dp[0][0] = prices[0];
    dp[0][1] = 0; 

    for(i = 1; i < pricesSize; i ++){
        // dp[i][0] 先算到第i天为止,能买的最便宜的股票
        dp[i][0] = dp[i-1][0];
        if(prices[i] < dp[i-1][0]) dp[i][0] = prices[i];

        // dp[i][1] 计算到第i天位置,能卖出的最大利润
        // prices[i]-dp[i-1][0]表示今天把股票买了能获得的最大利润
        // dp[i-1][1] 表示之前能获得的最大利润
        dp[i][1] = dp[i-1][1];
        if(prices[i]-dp[i-1][0] > dp[i-1][1]) dp[i][1] = prices[i]-dp[i][0];
    }

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

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