当前位置: 首页 > news >正文

代码随想录day41dp8

文章目录

  • 121. 买卖股票的最佳时机
  • 122.买卖股票的最佳时机II
  • 123.买卖股票的最佳时机III

121. 买卖股票的最佳时机

题目链接
文章讲解
贪心

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

dp

class Solution {
public:int maxProfit(vector<int>& prices) {int n = prices.size();if (n == 0) return 0;// dp[i][0] 表示第i天不持有股票的最大收益// dp[i][1] 表示第i天持有股票的最大收益vector<vector<int>> dp(n, vector<int>(2, 0));// 初始化dp[0][0] = 0;            // 第0天不持股dp[0][1] = -prices[0];   // 第0天持股,买入价格为-prices[0]for (int i = 1; i < n; ++i) {// 第i天不持股,要么昨天就不持股,要么今天卖掉dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] + prices[i]);// 第i天持股,要么昨天就持股,要么今天买入(只能买一次)dp[i][1] = max(dp[i - 1][1], -prices[i]);}// 最终答案为最后一天不持股时的最大收益return dp[n - 1][0];}
};

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

题目链接
文章讲解
贪心

class Solution {
public:int maxProfit(vector<int>& prices) {int res = 0;  // 初始化最大利润为0// 遍历价格数组,计算每次相邻价格的利润for (int i = 0; i < prices.size() - 1; i++) {// 如果明天的价格比今天高,则进行买卖// prices[i+1] - prices[i] 为利润,如果为负数,则不进行交易(利润为0)res += max(prices[i + 1] - prices[i], 0);  }return res;  // 返回总利润}
};

dp

class Solution {
public:int maxProfit(vector<int>& prices) {int n = prices.size();if (n == 0) return 0;// dp[i][0] - 第i天不持有股票的最大利润// dp[i][1] - 第i天持有股票的最大利润vector<vector<int>> dp(n, vector<int>(2, 0));// 初始状态dp[0][0] = 0;  // 第0天不持股dp[0][1] = -prices[0];  // 第0天持股,买入股票for (int i = 1; i < n; ++i) {// 第i天不持股,要么昨天就不持股,要么今天卖掉dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] + prices[i]);// 第i天持股,要么昨天就持股,要么今天买入dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] - prices[i]);}// 最终结果是第n-1天不持股的最大利润return dp[n - 1][0];}
};

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

题目链接
文章讲解

class Solution {
public:int maxProfit(vector<int>& prices) {if (prices.size() == 0) return 0;  // 如果价格数组为空,返回 0 利润vector<vector<int>> dp(prices.size(), vector<int>(5, 0));  // 创建 DP 数组// 初始化第 0 天的交易状态dp[0][1] = -prices[0];  // 第 0 天持有第一笔股票,最大利润是 -prices[0]dp[0][3] = -prices[0];  // 第 0 天持有第二笔股票,最大利润是 -prices[0]// 从第 1 天开始遍历for (int i = 1; i < prices.size(); i++) {// 不进行任何操作,利润保持不变dp[i][0] = dp[i - 1][0];// 持有第一笔股票的最大利润,选择买入或继续持有dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] - prices[i]);// 完成第一笔交易的最大利润,选择卖出或继续dp[i][2] = max(dp[i - 1][2], dp[i - 1][1] + prices[i]);// 持有第二笔股票的最大利润,选择买入或继续持有dp[i][3] = max(dp[i - 1][3], dp[i - 1][2] - prices[i]);// 完成第二笔交易的最大利润,选择卖出或继续dp[i][4] = max(dp[i - 1][4], dp[i - 1][3] + prices[i]);}// 返回完成第二笔交易后最大利润return dp[prices.size() - 1][4];}
};
http://www.dtcms.com/a/291310.html

相关文章:

  • 教资科三【信息技术】— 学科知识: 第三章(多媒体技术)
  • Java I/O模型深度解析:BIO、NIO与AIO的演进之路
  • CDN和DNS 在分布式系统中的作用
  • JAVA+AI教程-第三天
  • 数据库mysql是一个软件吗?
  • 主流 MQ 的关键性能指标
  • 瑶池数据库Data+AI驱动的全栈智能实践开放日回顾
  • 5.Java的4个权限修饰符
  • 如何用 LUKS 和 cryptsetup 为 Linux 配置加密
  • 3.4 递归函数
  • GUI简介
  • CMake变量和环境变量之间的关系和区别CMAKE_EXPORT_COMPILE_COMMANDS环境变量作用
  • Weex 知识点
  • SymPy 中抽象函数求导与具体函数代入的深度解析
  • C多线程下的fwrite与write:深入挖掘与实战指南
  • 每日算法刷题Day51:7.21:leetcode 栈6道题,用时1h40min
  • 【项目实战】——深度学习.全连接神经网络
  • PostgreSQL SysCache RelCache
  • Java API (二):从 Object 类到正则表达式的核心详解
  • DevOps是什么?
  • Flutter中 Provider 的基础用法超详细讲解(一)
  • C++的“链”珠妙笔:list的编程艺术
  • JAVA序列化知识小结
  • mac终端设置代理
  • 拟合算法(1)
  • socket编程(UDP)
  • QGIS、ArcMap、ArcGIS Pro中的书签功能、场景裁剪
  • 本地部署Dify、Docker重装
  • 时序论文43 | WPMixer:融合小波分解的多分辨率长序列预测模型
  • Nginx配置proxy protocol代理获取真实ip