算法详解4:买卖股票的最佳时机系列(上)

文章目录

算法详解4:买卖股票的最佳时机系列(上)

121.买卖股票的最佳时机

先阅读题目要求:

题目要求我们在某一天进行买入然后在之后的日子里面卖出从而获取最大利益。

那么我们只要获取一个最小值和一个最大值,然后让其相减即可得到最大利益。

那么上述操作可行吗?

我们将示例1代入到我们的方法中去获取了最小值1,但是最大值是7。因为不能使用7 - 1所以这种方法不可以。

那么还能怎么处理呢?

我们不获取卖出时候的价格,只获取卖出时候的利润即可。此时我们只需要处理最小值即可。

test 复制代码
伪代码:
answer = max(answer, 此时卖出的利润);

细节处理:

因为可能在卖出时出现负数,所以answer初始化为0。

要求最小值所以可以给INT_MAX0x3f3f3f3f

cpp 复制代码
int maxProfit(vector<int>& prices) {
        int answer = 0;
        int minProfit = INT_MAX;

        for (int i = 0; i < prices.size(); ++i) {
            minProfit = std::min(minProfit, prices[i]);
            answer = std::max(answer, prices[i] - minProfit);
        }

        return answer;
    }

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

先阅读题目要求:

题目要求我们在可以当天多次买卖股票,但是手中最多只能持有1股,然后获取最大利润。

和上一题不一样的是这道题可以当天多次买入和卖出。

那么该怎么处理呢?

由于题目要求我们手中只能持有1股,所以在每天结束的时候我们手中就会出现持有股票和没有股票两种状态。那么我们不需要纠结今天到底该不该交易,我们只需要关注今天结束时,这两种状态下我的'口袋里的现金'分别是多少。

因为利润可以理解为手中的现金余额。买入股票就是"花掉现金",所以利润减少;卖出股票就是"获得现金",利润增加。

使用变量:

cpp 复制代码
int dp0 = 0, dp1 = -prices[0];

int newDp0 = max(dp0,dp1 + prices[i]);
int newDp1 = max(dp1,dp0 - prices[i]);

dp0 = newDp0;
dp1 = newDp1;

使用数组:

cpp 复制代码
vector<vector<int>> dp(n,vector<int>(2));
dp[0][0] = 0;
dp[0][1] = -prices[0];

dp[i][0] = max(dp[i - 1][0],dp[i - 1][1] +  prices[i]);
dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] - prices[i]);

完整代码(使用数组版)

cpp 复制代码
int maxProfit(vector<int>& prices) {
        int n = prices.size();
        if (n == 0) return 0;

        // dp[i][0] 无股票, dp[i][1] 有股票
        vector<vector<int>> dp(n, vector<int>(2));
        
        // 初始化
        dp[0][0] = 0;
        dp[0][1] = -prices[0];

        for (int i = 1; i < n; i++) {
            dp[i][0] = max(dp[i-1][0], dp[i-1][1] + prices[i]);
            dp[i][1] = max(dp[i-1][1], dp[i-1][0] - prices[i]);
        }

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

完整代码(使用变量版)

cpp 复制代码
 int maxProfit(vector<int>& prices) {
        // 因为只能持有一支股票,那就不能在最低价进行抄底,
        // 那么只能当天买入或者前一天买入然后当天卖出或者前一天卖出才能得到最高利润
        int n = prices.size();
        int dp0 = 0, dp1 = -prices[0];

        for (int i = 0; i < n; ++i) {
            // 每一天都计算一下最高利润然后给给dp0 和 dp1
            int newDp0 = std::max(dp0, dp1 + prices[i]);
            int newDp1 = std::max(dp1, dp0 - prices[i]);

            dp0 = newDp0;
            dp1 = newDp1;
        }

        return dp0;
    }
相关推荐
维克兜率天2 小时前
【维克】动量指标家族:RSI、ROC、CCI、Momentum全面解析
python·算法
AI情绪识别开源3 小时前
检信 AI 智能推广平台(代号:JX-Promote)
人工智能·算法·erlang
老当益壮梁奶奶4 小时前
Linux软件编程学习笔记(八):进程间通信详解(1)
linux·c语言·笔记·学习·算法
不会就选b4 小时前
算法日常・每日刷题--<BFS拓扑排序>4
算法
不正经学生4 小时前
C语言动态内存管理(上):堆上的自由与责任
c语言·开发语言·c++·算法·面试
伟大的车尔尼4 小时前
贪心的概念
数据结构·算法·贪心
方方洛4 小时前
vllm教程-00-前言与导读
人工智能·算法·vllm
IT毕设实战小研5 小时前
电影数据可视化推荐系统
大数据·后端·爬虫·python·算法·信息可视化·课程设计
且随疾风前行.5 小时前
从驱动来分析服务的添加过程
算法