随想录一刷Day49——动态规划

news/2024/7/5 3:42:21

文章目录

  • Day49_动态规划
    • 32. 买卖股票的最佳时机
    • 33. 买卖股票的最佳时机 II

Day49_动态规划

32. 买卖股票的最佳时机

121. 买卖股票的最佳时机
思路一:

由于股票最多买入卖出一次,所以记录前面出现的最低股票价格,找到最低价格之后的最高价格出售,这里要注意统计的顺序,不要还没有买入就卖出了。

class Solution {
public:int maxProfit(vector<int>& prices) {int prices_size = prices.size();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

  1. dp[i][0]代表第i天手上不持股的最大持有现金数,
    dp[i][1]代表第i天手上持股的最大持有现金数
  2. 递推公式:
  • dp[i][0] = max(dp[i-1][0], dp[i-1][0] + prices[i]); // max(前一天不持股,前一天持股但今天卖出去了)
  • dp[i][1] = max(-prices[i], dp[i-1][1]); // max(前一天不持股今天买入,前一天持股今天不卖出)
  1. 初始化:第一天买入或者不买入
  • dp[0][1] = -prices[0]
  • dp[0][0] = 0
  1. 递推顺序,每个dp[i-1]由其前一天递推而来,所以递归顺序从前往后
  2. 样例推演,偷图(不过图中的0和1与我的定义相反)
    在这里插入图片描述
class Solution {
public:int maxProfit(vector<int>& prices) {int prices_size = prices.size();if (prices_size == 0) return 0;vector<vector<int>> dp(prices_size, vector<int>(2, 0));dp[0][0] = 0;dp[0][1] = -prices[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], -prices[i]);}return dp[prices_size - 1][0]; // 一定是不持股的现金多,持股手上现金数为负}
};

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

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

dp

  1. dp[i][0]表示第i天不持股的现金数
    dp[i][1]表示第i天持股的现金数
  2. 递推公式
  • dp[i][0] = max(dp[i-1][0], dp[i-1][1] + prices[i]) // 前一天不持股今保持,前一天持股今日卖出
  • dp[i][1] = max(dp[i-1][0] - prices[i], dp[i-1][1]) // 前一天不持股今日买入,前一天持股今日保持
  1. 初始化:
  • dp[0][0] = 0
  • dp[0][1] = -prices[i]
  1. 递推顺序,从前往后

时间复杂度:O(n)O(n)O(n)
空间复杂度:O(n)O(n)O(n)

class Solution {
public:int maxProfit(vector<int>& prices) {int prices_size = prices.size();if (prices_size == 0) return 0;vector<vector<int>> dp(prices_size, vector<int>(2, 0));dp[0][0] = 0;dp[0][1] = -prices[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][0];}
};

利用滚动数组优化空间:
由于每天只用到了前一天的值,所以数组空间只需要开今天和昨天两天的维度大小即可

时间复杂度:O(n)O(n)O(n)
空间复杂度:O(1)O(1)O(1)

class Solution {
public:int maxProfit(vector<int>& prices) {int prices_size = prices.size();if (prices_size == 0) return 0;vector<vector<int>> dp(2, vector<int>(2, 0));dp[0][0] = 0;dp[0][1] = -prices[0];for (int i = 1; i < prices_size; i++) {dp[i % 2][0] = max(dp[(i - 1) % 2][0], dp[(i - 1) % 2][1] + prices[i]);dp[i % 2][1] = max(dp[(i - 1) % 2][1], dp[(i - 1) % 2][0] - prices[i]);}return dp[(prices_size - 1) % 2][0];}
};

http://lihuaxi.xjx100.cn/news/290430.html

相关文章

0x32.数学知识 - 约数

目录一、约数定义算术基本定理的推论求NNN的正约数集合 - 试除法求1~N每个数的正约数集合 - 倍数法AcWing198. 反素数二、最大公约数最大公约数与最大公倍数更相减损术luogu P1072 &#xff08;NOIP2009&#xff09;Hankson的趣味题三、互质与欧拉函数三种方法求欧拉函数积性函…

陆奇要离职?先看看百度财报吧

作者 | 阿司匹林出品 | AI科技大本营&#xff08;公众号ID&#xff1a;rgznai100&#xff09;昨日下午&#xff08;4 月 26 日&#xff09;&#xff0c;百度集团总裁兼首席运营官陆奇和比亚迪董事局主席王传福一同出现在北京车展。然而&#xff0c;晚间就有消息传出来&#xff…

setTimeOut() 和 setTimeInterval()

setTimeOut()は、指定された時間「待ってから」指定された動作を行う関数です。setTimeOut():等待指定时间&#xff0c;执行指定方法。 setTimeInterval()は、指定された時間「間隔ごとに」指定された動作を行う関数です。setTimeInterval&#xff08;&#xff09;&#xff1a;…

【算法笔记】树链剖分

整理的算法模板合集&#xff1a; ACM模板 目录一些概念一些性质实现P3384 【模板】轻重链剖分树链剖分 一些概念 重儿子&#xff1a;父亲节点的所有儿子中子树结点数目最多&#xff08;size最大&#xff09;的结点&#xff1b;轻儿子&#xff1a;父亲节点中除了重儿子以外的儿…

手机AI、购物AI...还有哪个“AI+”被忽略了?

AI 技术似乎成了一把“万能钥匙”&#xff0c;捅进任何一个拥有数据的行业钥匙孔里&#xff0c;它都具有一定的适配能力。AI 应用在手机上&#xff0c;提升了图像识别和语音识别的效率&#xff1b;AI 应用在医疗影像中&#xff0c;可以辅助医生进行快速阅片诊断&#xff1b;AI …

【动态规划】区间DP - 最优矩阵链乘(另附POJ1651Multiplication Puzzle)

最优矩阵链乘&#xff08;动态规划&#xff09; 一个n∗mn*mn∗m的矩阵由 nnn 行 mmm 列共 n∗mn*mn∗m 排列而成。两个矩阵A和B可以相乘当且仅当A的列数等于B的行数。一个nm的矩阵乘mp的矩阵&#xff0c;运算量为nmp。 矩阵乘法不满足分配律&#xff0c;但满足结合律。因此A…

linux中实现pxe的自动安装

linux中实现pxe的自动安装 什么是PXE PXE(preboot execute environment)是由Intel公司开发的最新技术,工作于Client/Server的网络模式&#xff0c;支持工作站通过网络从远端服务器下载映像&#xff0c;并由此支持来自网络的操作系统的启动过程&#xff0c;其启动过程中&#xf…

随想录一刷Day17——二叉树

文章目录Day17_二叉树12. 平衡二叉树13. 二叉树的所有路径左叶子之和Day17_二叉树 12. 平衡二叉树 110. 平衡二叉树 思路&#xff1a; 递归法&#xff1a;左右子树的高度差超过1&#xff0c;则不是平衡二叉树 class Solution { public:// 求树的高度&#xff0c;是后续遍历in…