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

leetcode 股票问题全序列

1 只允许一次交易,121题,买卖股票的最佳时机

class Solution {/*给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。
你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。*/
public:int maxProfit(vector<int>& prices) {if(prices.size()<2){return 0;}int maxP=0x80000000;int minPrice=prices[0];for(int i=1;i<prices.size();i++){if(minPrice>prices[i]){minPrice=prices[i];}maxP=max(maxP,prices[i]-minPrice);}return maxP;}
};

2 可以交易多次,122题, 买卖股票的最佳时机2

class Solution {/*题目:给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。
在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。
返回 你能获得的 最大 利润 。
题解:
贪心
因为不限制交易次数,只要今天价格比昨天高,就交易,利润为正累加,最后的和就是最大的利润*/
public:int maxProfit(vector<int>& prices) {if(prices.size()<2){return 0;}int res=0;for(int i=0;i<prices.size()-1;i++){if(prices[i+1]>prices[i]){res+=(prices[i+1]-prices[i]);}}return res;}
};

3 最多2次交易,123题, 买卖股票的最佳时机3

class Solution {/*给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。题解:动态规划:dp[i][j] 中 i 表示第 i 天,j为 [0−4]五个状态,dp[i][j]表示第i天状态j所得最大现金j=0无操作 =1第一次买入,=2第一次卖出,=3第二次买入,=4第二次卖出|buy|buy|sell|sell|sell|buy|buy||---|---|----|----|----|---|---||    |当天第一次 保持卖出*/
public:int maxProfit(vector<int>& prices) {if(prices.size()<1){return 0;}// dp[i][j]表示第i天状态j所得最大现金vector<vector<int>>dp(prices.size(),vector<int>(5,0));// initdp[0][0]=0;dp[0][1]=-prices[0];dp[0][2]=0;//第一天就卖出 相当于第一次买入后又卖出了dp[0][3]=-prices[0];// 第二次买入依赖于第一次卖出的状态,其实相当于第0天第一次买入了,第一次卖出了,// 然后再买入一次(第二次买入),那么现在手头上没有现金,只要买入,现金就做相应的减少dp[0][4]=0;for(int i=1;i<prices.size();i++){// 1. 第i天无操作,则之前也是没有操作dp[i][0]=dp[i-1][0];// 2. 第i天第一次买入dp[i][1]=max(dp[i-1][1],//前一天买入,当天保持dp[i-1][0]-prices[i]//当天买入,前一天还是没有操作);// 3. 第i天第一次卖出dp[i][2]=max(dp[i-1][2],//前一天卖出,当天保持dp[i-1][1]+prices[i]//当天第一次卖出,前一天还是第一次买入);// 4. 第i天第二次买入dp[i][3]=max(dp[i-1][3],//前一天买入,当天保持dp[i-1][2]-prices[i]//当天买入,前一天还是第一次卖出);// 5. 第i天第二次卖出dp[i][4]=max(dp[i-1][4],//前一天卖出,当天保持dp[i-1][3]+prices[i]//当天第二次卖出,前一天还是第二次买入);}return dp[prices.size()-1][4];}
};

4. 最多k次交易,188题,买卖股票的最佳时间4

class Solution {/*题目:给你一个整数数组 prices 和一个整数 k ,其中 prices[i] 是某支给定的股票在第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。也就是说,你最多可以买 k 次,卖 k 次。题解:定义一个三维数组dp[n][k][2]这里n表示天数,dp[i][j][0]:表示第i天交易了j次时卖出后的累计最大利润dp[i][j][1]:表示第i天交易了j次时买入后的累计最大利润1. 第一次买入:要么前一天买入后保持,要么从初始态第一次买入dp[i][0][1]=max(dp[i-1][0][1],dp[i-1][0][0]-prices[i])第一次卖出(注意已经完成一次交易这里j=1):要么前一天卖出后保持,要么从前一天第一次买入后,当天卖出dp[i][1][0]=max(dp[i-1][1][0],dp[i-1][0][1]+prices[i])2. 第二次买入:要么前一天买入后保持,要么从前一天第一次卖出后当天第二次买入dp[i][1][1]=max(dp[i-1][1][1],dp[i-1][1][0]-prices[i])第二次卖出(注意已经完成一次交易这里j=2):要么前一天卖出后保持,要么从前一天第二次买入后,当天卖出dp[i][2][0]=max(dp[i-1][2][0],dp[i-1][1][1]+prices[i])...j. 第j次买入:要么前一天买入后保持,要么从前一天第j-1次卖出后当天第二次买入dp[i][j-1][1]=max(dp[i-1][j-1][1],dp[i-1][j-1][0]-prices[i])第二次卖出(注意已经完成一次交易这里j=j):要么前一天卖出后保持,要么从前一天第j次买入后,当天卖出dp[i][j][0]=max(dp[i-1][j][0],dp[i-1][j-1][1]+prices[i])initfor(int i = 0; i <= k; ++i) {dp[0][i][0] = 0;// 第一天,不管交易多少次,卖出都是0收入dp[0][i][1] = -prices[0]; // 第一天,不管交易多少次,买入的收入是-prices[0]}三维数组太高了进行压缩,从上面DP公式可以知道,可以去掉天数纬度,用二维数组dp[k][2]来表示则有:dp[j-1][1]=max(dp[j-1][1],dp[j-1][0]-prices[i])dp[j][0]=max(dp[j][0],dp[j-1][1]+prices[i])*/
public:int maxProfit122(vector<int>&prices){// 不限制次数的交易if(prices.size()<2){return 0;}int res=0;for(int i=0;i<prices.size()-1;i++){if(prices[i+1]>prices[i]){res+=prices[i+1]-prices[i];}}return res;}int maxProfit(int k, vector<int>& prices) {int n=prices.size();if(k>=n){// 类似122题,不限制次数的交易return maxProfit122(prices);}// dp[j][z]交易第j次z=0时候卖出后的收益,// dp[j][z]交易第j次z=1时候买入后的收益vector<vector<int>>dp(k+1,vector<int>(2,0));// init 根据三维降级而得,第一天for(int i=0;i<k;i++){dp[i][0]=0;//第一天无论交易多少次,卖出后的收益都是0dp[i][1]=-prices[0];//第一天无论交易多少次,买入后的收益都是-price[0]}for(int i=1;i<prices.size();i++){for(int j=1;j<=k;j++){dp[j-1][1]=max(dp[j-1][1],dp[j-1][0]-prices[i]);dp[j][0]=max(dp[j][0],dp[j-1][1]+prices[i]);}}return dp[k][0];}
};

http://www.lryc.cn/news/261265.html

相关文章:

  • SpringBoot中日志的使用log4j2
  • 机械设备企业网站建设的效果如何
  • 设计模式之结构型设计模式(二):工厂模式 抽象工厂模式 建造者模式
  • 算法模板之单链表图文讲解
  • 【强化学习-读书笔记】表格型问题的 Model-Free 方法
  • 【手撕算法系列】k-means
  • D33|动态规划!启程!
  • C语言----文件操作(二)
  • oracle 10046事件跟踪
  • 微软自带浏览器Edge,无法关闭“保存历史记录网站的屏幕截图”解决方案
  • 讲座 | 颠覆传统摄像方式乃至计算机视觉的“脉冲视觉”
  • uniGUI学习之UniHTMLMemo1富文本编辑器
  • 详细教程 - 从零开发 鸿蒙harmonyOS应用 第四节 (鸿蒙Stage模型 登录页面 ArkTS版 推荐使用)
  • uniapp怎么实现授权登录
  • 从零开始:前端架构师的基础建设和架构设计之路
  • 椋鸟C语言笔记#26:数据在内存中的存储(大小端字节序)、浮点数的存储(IEEE754)
  • 设计模式——组合模式(结构型)
  • 鸿蒙小车之多任务调度实验
  • 【报错栏】(vue)Module not found: Error: Can‘t resolve ‘element-ui‘ in xxx
  • seaborn库图形进行数据分析(基于tips数据集)
  • AC843. n皇后问题--60
  • Js WebSocket类,收发Json,带心跳,断线重连
  • VBA技术资料MF96:单字段多条件高级筛选
  • 电子取证中Chrome各版本解密Cookies、LoginData账号密码、历史记录
  • Axure元件基本介绍进阶
  • 安卓11添加切换以太网动态静态方法
  • 初级数据结构(五)——树和二叉树的概念
  • pdf读取内容缺失(漏字/文字丢失)问题
  • c#面试基础语法——现有⼀个整数number,请写⼀个⽅法判断这个整数是否是2的N次⽅
  • 27系列DGUS智能屏发布:可实时播放高清模拟信号摄像头视频