Files
leetcode-master/problems/0121.买卖股票的最佳时机.md
youngyangyang04 edd9ed4036 Update
2020-12-29 09:31:49 +08:00

1.6 KiB
Raw Blame History

思路

暴力

这道题目最直观的想法,就是暴力,找优间距了。

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int result = 0;
        for (int i = 0; i < prices.size(); i++) {
            for (int j = i + 1; j < prices.size(); j++){
                result = max(result, prices[j] - prices[i]);
            }
        }
        return result;
    }
};
  • 时间复杂度O(n^2)
  • 空间复杂度O(1)

当然该方法超时了。

贪心

因为股票就买卖一次,那么贪心的想法很自然就是取最左最小值,取最右最大值,那么得到的差值就是最大利润。

C++代码如下:

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int low = INT_MAX;
        int result = 0;
        for (int i = 0; i < prices.size(); i++) {
            low = min(low, prices[i]);  // 取最左最小价格
            result = max(result, prices[i] - low); // 直接取最大区间利润
        }
        return result;
    }
};

动态规划

dp[i][0] 表示第i天持有股票所得现金 dp[i][1] 表示第i天不持有股票所得现金

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int n = prices.size();
        if (n == 0) return 0;
        vector<vector<int>> dp(n, vector<int>(2, 0));
        dp[0][0] -= prices[0]; // 持股票
        for (int i = 1; i < n; i++) {
            dp[i][0] = max(dp[i - 1][0], -prices[i]); // 买入
            dp[i][1] = max(dp[i - 1][1], prices[i] + dp[i - 1][0]); // 卖出
        }
        return dp[n - 1][1];
    }
};