算法训练营第四十九天||● 121. 买卖股票的最佳时机 ● 122.买卖股票的最佳时机II

● 121. 买卖股票的最佳时机

暴力和贪心都可以解决

主要讲解动态规划

dp数组:我们把dp数组定义为一个二维的vector容器

dp[i][0]表示第i天持有股票手中的金额:它可以是当天买入的也可以是之前买入的

dp[i][1]表示第i天不持有股票手中的金额:可以是当天卖出的也可以是之前卖出的

初始化:

dp[0][0]:第0天就持有股票,说明它第0天买入了股票 此时手中现金为 -peices[0]

dp[0][1]:第0天不持有股票,说明它既没有买入也没有卖出 手中现金为0。

遍历顺序:从前往后 后一天由前一天推导出。

递推公式:

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

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

最后返回值:就是最后一天不持有股票的手中的最大现金

复制代码
class Solution {
public:
    int maxProfit(vector<int>& prices) {
        vector<vector<int>> dp(prices.size()+1,vector<int>{0,0});
        dp[0][0] = -prices[0];
        dp[0][1] = 0;
        for(int i = 1;i<prices.size();i++){
            dp[i][0] = max(dp[i-1][0],-prices[i]);//第i天不持有股票的最大金额
            dp[i][1] = max(dp[i-1][1],prices[i]+dp[i-1][0]);//第i天持有股票的最大金额
        }
        return max(dp[prices.size()-1][0],dp[prices.size()-1][1]);
    }
};

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

与上一题的唯一区别就是 股票可以买卖多次,递推公式的时候略微有点变化

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

是由前一天持有股票,或者前一天不持有股票今天买入的最大值组成 ,此时前一天不持有股票手中现金不再是0而是dp[i-1][1]

dp[i][1]与上一道题完全相同。

复制代码
class Solution {
public:
    int maxProfit(vector<int>& prices) {
        vector<vector<int>> dp(prices.size()+1,vector<int>{0,0});
        dp[0][0] = -prices[0];
        dp[0][1] = 0;
        for(int i = 1;i<prices.size();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[prices.size()-1][1];
    }
};
相关推荐
Wect17 分钟前
LeetCode 210. 课程表 II 题解:Kahn算法+DFS 双解法精讲
前端·算法·typescript
颜酱1 小时前
单调队列:滑动窗口极值问题的最优解(通用模板版)
javascript·后端·算法
Gorway8 小时前
解析残差网络 (ResNet)
算法
拖拉斯旋风8 小时前
LeetCode 经典算法题解析:优先队列与广度优先搜索的巧妙应用
算法
Wect8 小时前
LeetCode 207. 课程表:两种解法(BFS+DFS)详细解析
前端·算法·typescript
灵感__idea1 天前
Hello 算法:众里寻她千“百度”
前端·javascript·算法
Wect1 天前
LeetCode 130. 被围绕的区域:两种解法详解(BFS/DFS)
前端·算法·typescript
NAGNIP2 天前
一文搞懂深度学习中的通用逼近定理!
人工智能·算法·面试
颜酱2 天前
单调栈:从模板到实战
javascript·后端·算法
CoovallyAIHub2 天前
仿生学突破:SILD模型如何让无人机在电力线迷宫中发现“隐形威胁”
深度学习·算法·计算机视觉