题目链接:力扣

思路:

1.动态规划:

第i天卖出的最大值,为第i天的价格-前i-1天的最小值,只要用dp[i]数组记录前i天的最小值

问题转化为:price[i]-dp[i-1]的最大值

1.1用dp记录前i天最小值

   定义dp数组:dp[i]表示前i天的最小值

状态转移方程:dp[i]=min{dp[i-1] ,prices[i]}

解释: 如果第i天的值小于等于前i-1天的最小值,前i天的最小值为第i天的值

如果第i天的值大于前i-1天的最小值,前i天的最小值为前i-1天的最小值

 出口:dp[0]=price[0]

问题求解:变量数组,求price[i]-dp[i-1]的最大值

代码:

class Solution {
public:int maxProfit(vector<int>& prices) {//dp[i]表示前i天的最小值
//dp[i]={dp2[i-1],price[i]}
//dp[0]=prices[0]vector<int>dp(prices.size());
dp[0]=prices[0];
for(int i=1;i<prices.size();i++)
{dp[i]=min(dp[i-1],prices[i]);
}
int max_value=0;
for(int i=1;i<prices.size();i++)
{max_value=max(max_value,prices[i]-dp[i-1]);
}
return max_value;}
};

利用滚动数组优化:

class Solution {
public:int maxProfit(vector<int>& prices) {//dp表示遍历前i天的最小值
//dp=min{dp,price[i]}
//dp=prices[0]//vector<int>dp(prices.size());
int dp=prices[0];
int max_value=0;
for(int i=1;i<prices.size();i++)
{dp=min(dp,prices[i]);max_value=max(max_value,prices[i]-dp);
}
return max_value;}
};

1.2用dp[i][0]和dp[i][1]分别记录第i天持有股票和第i天不持有股票可以获得最大利润

参考链接:代码随想录

dp[i][0]表示第i天持有股票所得的最多现金

注意:(1)一开始现金为0,第i天买入股票所得最多现金就是-price[i],这是一个负数

(2)持有股票可能是今天买入,有可能是前几天买入

状态转移方程:

(1)如果第i天持有股票,即dp[i][0]是第i天持有股票获得的最多的现金,dp[i][0]可以由两个状态推出

● 第i-1天就持有股票,保持现状,dp[i][0]=dp[i-1][0]

● 第i天买入股票,dp[i][0]=-price[i]

dp[i][0]选最大的,dp[i][0]=max(dp[i-1][0],-price[i])

(2)如果第i天不持有股票,即dp[i][1]是第i天不持有股票获得的最多的现金

●如果第i天卖出,dp[i][1]=price[i]+dp[i-1][0]

理解:第i天卖出说明,第i-1天持有股票,获得收益为前i-1天的收益+第i天的收益

●如果第i天不卖出,说明已经卖出去,收益和第i-1天相同,dp[i][1]=dp[i-1][1]

dp[i][1]取最大的,dp[i][1]=max(dp[i-1][1],price[i]+dp[i-1][0]);

2.维护最小值:

遍历数组,max(price[i]-前i-1天的最小值),在遍历的同时用一个变量记录最小值

代码:

class Solution {
public:int maxProfit(vector<int>& prices) {
//维护最大值和最小值
int max_value=0;
int min_price=12345;
for(int i=0;i<prices.size();i++)
{min_price=min(min_price,prices[i]);max_value=max(max_value,prices[i]-min_price);}
return max_value;}
};

LeetCode 121买卖股票的时机相关推荐

  1. LeetCode #121 买卖股票的最佳时机 贪心 单调栈 动态规划

    LeetCode #121 买卖股票的最佳时机 题目描述 给定一个数组,它的第 iii 个元素是一支给定股票第 iii 天的价格. 如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算 ...

  2. leetcode - 121.买卖股票的最佳时机

    121.买卖股票的最佳时机 ------------------------------------------ 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 如果你最多只允许完成 ...

  3. LeetCode - 121. 买卖股票的最佳时机

    121. 买卖股票的最佳时机 class Solution {public int maxProfit(int[] prices) {if (prices == null || prices.leng ...

  4. LeetCode 121:买卖股票的最佳时机 思考分析

    题目描述: 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润. 注意:你不能在买入股票 ...

  5. leetcode.121. 买卖股票的最佳时机(best-time-to-buy-and-sell-stock)

    文章目录 121. 买卖股票的最佳时机 代码与思路 暴力法 一次遍历 单调栈 122. 买卖股票的最佳时机 II 代码与思路 股票问题系列通解 121. 买卖股票的最佳时机 给定一个数组,它的第 i ...

  6. LeetcodeHOT100——121.买卖股票的时机

    买卖股票的最佳时机 题目 题解 2021.12.6 贪心 2021.12.6背包 题目 题解 贪心 背包解法(这个我还没理解透....) 2021.12.6 贪心 这个贪心我看题解感觉容易理解,但是看 ...

  7. 105. Leetcode 121. 买卖股票的最佳时机 (动态规划-股票交易)

    给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格. 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票.设计一个算法来 ...

  8. LeetCode 123买卖股票的时机 III

    题目链接力扣 一天结束时,可能有持股,可能未持股,可能卖出过1次,可能卖出过2次,也可能为卖出过 定义状态转移数组dp[天数][当前是否持股][卖出的次数] 动态规划: 1.未持股,没卖出过股票:利润 ...

  9. leetcode 121. 买卖股票的最佳时机 (贪心 + 动规 + 双指针

    贪心的思路: 得到最小值,再挨个用数组中的值减去最小值,最终值取一个最大的 class Solution { public:int maxProfit(vector<int>& p ...

最新文章

  1. java培训教程分享:Java中用户如何自定义异常?
  2. hive常用sql语句
  3. 数据结构与算法:异或运算
  4. Hbase 学习(三)Coprocessors
  5. IOS 同步请求和异步请求 ios开发教程
  6. 事务日志已满,原因为“ACTIVE_TRANSACTION”
  7. 一个简单的封ip规则
  8. ffmpeg解码H.264视频数据,MFC播放视频
  9. UVA - 1267 Network
  10. OpenWrt分支LEDE嵌入式无线路由系统定制-1.编辑环境搭建
  11. 撞库***:一场需要用户参与的持久战
  12. 【干货】400+页的《面向机器学习的数学》pdf
  13. 【计网知识点总结】1概述
  14. php 0 加减乘除,php 加减乘除计算器 用php简单实现加减乘除计算器
  15. java五子棋音乐_五子棋加背景音乐
  16. 企业大数据平台解决方案
  17. 【推荐算法 学习与复现】-- 深度学习系列 -- NFM
  18. Asp.net 中将文字写入图片中
  19. 淘宝美工设计就业前景怎么样?有发展前途吗?
  20. 2017 ACM-ICPC 亚洲区(西安赛区)网络赛 Xor

热门文章

  1. HDOJ_1016 素数环
  2. Delphi常用字符串函数
  3. 十步完成windows服务的安装
  4. CCF201703-1 分蛋糕(100分)【序列处理】
  5. UVA485 Pascal‘s Triangle of Death【大数】
  6. HDU1570 A C【水题】
  7. POJ3435 Sudoku Checker【谜题+数独】
  8. ACM-ICPC是什么样的比赛
  9. 散列:散列函数与散列表(hash table)
  10. 数学家、数学轶事与数学史话