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

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

暴力和贪心都可以解决

主要讲解动态规划

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

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

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

初始化:

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

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

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

递推公式:

dpi0=max(dpi-10,pricesi)

dpi1=max(dpi-11,dpi-10+pricesi);

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

复制代码
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

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

dpi0 = max(dpi-10,dpi-11-pricesi);

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

dpi1与上一道题完全相同。

复制代码
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];
    }
};
相关推荐
倒头就睡的小比特12 小时前
算法竞赛C++常用的STL
c++·算法
小羊没烦恼!12 小时前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
猎头南楼13 小时前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
旖旎夜光14 小时前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
wzdark14 小时前
大规模并行计算中的负载均衡算法研究4
算法
Because_of_Her115 小时前
并查集-听课笔记
笔记·算法·并查集
码流子15 小时前
高速公路安全监测实践:碰撞监测预警+物联网底座,从感知到处置的闭环
大数据·人工智能·物联网·算法·架构
another heaven15 小时前
【算法/C++ MD5算法能否逆解码?原理、C++实现与同类哈希算法对比】
c++·算法·哈希算法
wzdark15 小时前
从算法设计模式看编程思维的抽象能力4
算法
2601_9622186115 小时前
万象生鲜系统称重自动多退少补算法解决生鲜非标品痛点
大数据·数据库·人工智能·python·算法