121.买卖股票的最佳时机

——————————————————————————————————————————
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。

如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。

注意你不能在买入股票前卖出股票。

示例 1:

输入: [7,1,5,3,6,4]
输出: 5
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。
示例 2:

输入: [7,6,4,3,1]
输出: 0
解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。
——————————————————————————————————————————
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock
——————————————————————————————————————————

解题思路

注意题目中是只进行一次交易,选择盈利最大的交易方式。

解法一:暴力解法
从第一天开始,计算之后每一天与第一天的价格之差,比较好保存最大值。然后从第二天开始,计算之后每一天与第二天的价格之差,比较后保存最大值。一直循环,直到最后一天,得到最后的结果,使用C++代码实现如下:

class Solution {
public:int maxProfit(vector<int>& prices) {int max = 0;  //用于保存最大值int length = prices.size();  //计算prices的元素个数for(int i=0;i<length;i++)   //从第一天开始for(int j=i+1;j<length;j++)  //计算之后每一天和第一天的价格之差{if(prices[j]>prices[i] && (prices[j]-prices[i]>max))max = prices[j]-prices[i];  // 保存最大值} return max;  //返回最大值}
};

解法二:动态规划
暴力解法需要用到两次循环,时间复杂度比较高。可以通过使用动态规划,每次保存当前的最低谷和最大的盈利金额。使用C++代码实现如下:

class Solution {
public:int maxProfit(vector<int>& prices) {int length = prices.size();int min = 0;  //用于保存最低谷的索引int max = 0;  //用于保存当前最低谷对应的盈利的最大金额for(int i=1;i<length;i++)  //min初始化为0。所以从第二天开始进行循环{if(prices[i] < prices[min])   //如果当前天的交易价格比当前的最低谷还低,则把最低谷的索引设置为当前天的索引min = i;else if(prices[i]-prices[min] > max)//如果交易金额大于最低谷,则计算当前交易价格与最低谷的差是不是大于当前的最大盈利max = prices[i] - prices[min];}return max;}
};

——————————————————————————————————————————
这是一道较为简单的LeetCode题目,在LeetCode题库中买卖股票的最佳时机的变种题有很多,接下来会引用笔者在另一篇博客中转载在LeetCode中看到的对这一类题型的整体框架解答。

如果您发现什么错误,请您联系我!

leetcode - 121.买卖股票的最佳时机相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

  7. LeetCode: 121. 买卖股票的最佳时机(C++)

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

  8. 158. Leetcode 121. 买卖股票的最佳时机 (贪心算法-股票题目)

    class Solution:def maxProfit(self, prices: List[int]) -> int:low, max_profit = float("inf&qu ...

  9. LeetCode 121. 买卖股票的最佳时机(Best Time to Buy and Sell Stock)

    简单粗暴的第一种解法: class Solution { public:int maxProfit(vector<int>& prices) {int m = prices.siz ...

最新文章

  1. 服务器 主动 推送 客户端浏览器 消息***
  2. Red Hat Enterprise Linux 5---system-config-*管理工具
  3. 矿用巷道巡检机器人_一种井下自动巡检机器人系统
  4. 删除目录下的特定命名的图片,获取特定名称图片的路径
  5. 树莓派python编程自学-两个简易的树莓派初学者Python程序
  6. python网上编程课程-程序设计入门—Python
  7. 以后版本网卡命名规则
  8. mysql不支持python3吗_MySQL的4种事务隔离级别你还不清楚吗?
  9. python把中文转英文_Python 3.0_文本清洗之中文特殊符号转英文特殊符号及全角字符转半角字符...
  10. 经验分享 | 二本直博浙大?我只是写了篇论文而已
  11. “四不像”病毒冒充多款知名软件 窃取电脑隐私
  12. ping和telnet
  13. static 和 const的解释(转载)
  14. 两平面直角坐标系之间的相互转换
  15. 程序员的数学基础课:编程中的数学思维
  16. Android视频列表自动播放功能
  17. 7000字长文深度解读:DTC商业模式,对品牌增长的颠覆式影响
  18. 恒生电子(杭州、武汉、上海、、、)来实习来春招
  19. 数电实验_时分秒计数器——终极版
  20. python日期处理、groupby聚合、求最大值、方差

热门文章

  1. NI Vision for LabVIEW 基础(二):准备测量图像
  2. 面试官系统精讲Java源码及大厂真题 - 19 LinkedBlockingQueue 源码解析
  3. Linux远程桌面服务VNC/XRDP/Xdmcp/SSH+X11转发及其在树莓派上的使用
  4. Windows环境下的Oracle数据库备份策略
  5. Oracle性能调优方法
  6. 【Unity|C#】基础篇(1)——基础入门
  7. 用户与组管理,磁盘管理
  8. java 课后习题 删除奇数元素下标 然后再删除值为奇数的下标
  9. #宝塔面板# #nginx+apache# KVS服务器运行环境搭建过程记录
  10. 浏览器 UC 自动添加关键字 去掉关键字