LeetCode 121. 122. 123. 买卖股票的最佳时机

本文探讨了三个股票交易问题:买卖股票的最佳时机I、II、III。通过动态规划和贪心策略,分别给出了求解每种情况下的最大利润算法。在最佳时机I中,寻找最低价格作为买入点;在最佳时机II中,如果当前价格高于前一个最低价,则进行交易;在最佳时机III中,两次交易考虑了两个不同的卖出时机,通过双指针法找到最大收益。
摘要由CSDN通过智能技术生成

121. 买卖股票的最佳时机

难度:简单。
标签:数组,动态规划。

正确解法:

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int minPrice = prices[0];
        int ans = 0;
        for(int i = 1; i < prices.size(); ++i){
            ans = max(ans, prices[i] - minPrice);
            minPrice = min(minPrice, prices[i]);
        }
        return ans;
    }
};

结果:
在这里插入图片描述

122. 买卖股票的最佳时机 II

难度:简单。
标签:贪心,数组,动态规划。

正确解法:

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int minPrice = prices[0];
        int ans = 0;
        for(int i = 1; i < prices.size(); ++i){
            if(prices[i] > minPrice){
                 ans += prices[i] - minPrice;
                 minPrice = prices[i];
            }
            else{
                minPrice = min(minPrice, prices[i]);
            }
        }
        return ans;
    }
};

结果:
在这里插入图片描述

123. 买卖股票的最佳时机 III

难度:简单。
标签:数组,动态规划。

顺着上面的思路写。
遍历两次数组,第一次计算dp,dp[i]表示到第i天为止,进行一次交易获得的最大收益。
第二次从后往前遍历数组,将最大值记录下来,即为卖出的价格。则maxPrice - prices[i] + dp[i]为第二次交易在第i天买入获得的最大收益,遍历i,找到最大值即可。

正确解法:

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int n = prices.size();
        vector<int> dp(n, 0);
        int minPrice = prices[0];
        int maxP1 = 0;
        for(int i = 1; i < n; ++i){
            dp[i] = max(max(0, prices[i] - minPrice), maxP1);
            minPrice = min(minPrice, prices[i]);
            maxP1 = max(dp[i], maxP1);
        }
        int maxPrice = prices[n - 1];
        int ans = 0;
        for(int i = n - 2; i >= 0; --i){
            ans = max(ans, maxPrice - prices[i] + dp[i]);
            maxPrice = max(maxPrice, prices[i]);
        }
        return ans;
    }
};

结果:
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值