JS leetcode 买卖股票的最佳时机 题解分析,我离职了。
壹 ❀ 引
昨天下班后,还是找经理提出了辞职,没有犹豫的裸辞,今天与人事的对话不小心被后台的同事听到,一下在公司传开了,下午我与同事们多人对线,被他们的消息轰炸....没错,我真的要走了。
因为什么原因呢?公司技术框架过于落后(angularjs1.6,不允许使用ES6等),很长时间我都很焦虑,担心自己再待下去是否会被这个行业淘汰,在过去的时间也学了一些东西,但都没法在工作中实践,以及待遇等等问题萦绕于心,才出此决策。
在与猎头的沟通中对方也是建议我先待着看看,不推荐裸辞,毕竟疫情影响行情不容乐观。我说如果当下处境良好我定会观望,只是深处温室之中越久,自己反而越害怕离职,涅槃重生还需经历烈火考验,比起骑驴找马,我还是更擅长破釜沉舟一点,祝自己好运。
还有一个月的工作交接期,顺便复盘自己的工作经历,还要复习,刷题,学习vue等等,压力巨大。不过既然是自己的决定,那就努力做到最好就好了。当然,后续面试我也会不断更新相关面试经历,多总结多积累,总没坏处。
好了,说了这么多,来看看今天的题目吧,题目来自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。
让我们简单分析题目,尝试解决它。
贰 ❀ 题解分析
其实当我看到[7,1,5,3,6,4]的例子,我第一反应也是为啥不是7-1=6,其实在题目的注意已经说明,我们在卖出股票时,必须得先买入,想要赚的多,一定是在历史最低价买入,在历史最高价卖出。注意,这个历史最低并不是数组中最小值,比如[3,5,1,2]这个例子,虽然我们在1买入最低,但后面价格只有2,利润反而不如3买入后5卖出。
我们需要理清的一点是,比如在第i天卖出,那么一定是在i-1天中最小的价格买入,因为得先买才能后卖,所以最笨的做法就是使用双循环,用尝试算出每一个i天与之前(i-1,i-2...)的差价,再找出其中最大的一个值即可,比如:
/**
* @param {number[]} prices
* @return {number}
*/
var maxProfit = function (prices) {
// 因为如果没有利润就是0,这里初始化
let maxProfit = 0;
for (let i = 0; i < prices.length; i++) {
// 注意,这里的j从i+1开始
for (j = i + 1; j < prices.length; j++) {
let profit = prices[j] - prices[i];
// 不断用当前利润和历史最大利润比较,如果更大就替换maxProfit
if (profit > maxProfit) {
maxProfit = profit;
};
};
};
return maxProfit;
};
很简单也非常好懂,但是我们也清楚,这个耗时太久,只要价格数据越大,我们查询代价就越大。那么有没有更好的做法呢?当然有。
其实找到最大利润,其实无非就是找到历史最低价格,但事实上我们不知道哪个是最低价,没关系,我们可以先假设第一天是最低,遍历数组的同时,让当前价格与历史最低比较,如果更低,那自然要更新历史最低价了。
更新了最低价之后呢?当然是用当前价格减去历史最低价求出利润,并与历史比较,始终记录较大的利润即可,直到遍历结束,返回最终的价格不就是最大的利润了,比如:
/**
* @param {number[]} prices
* @return {number}
*/
var maxProfit = function (prices) {
let maxProfit = 0,
// 假设0位价格为历史最低
minPrice = prices[0];
// i从1开始
for (let i = 1; i < prices.length; i++) {
// 如果后续价格比历史更低,更新最低价
minPrice = Math.min(minPrice, prices[i]);
// 计算利润,找出最大利润
maxProfit = Math.max(maxProfit, prices[i] - minPrice);
};
return maxProfit;
};
我们来以[7,6,4,3,1]这个例子来看,由于价格越来越低,最低价格也一直随便遍历变化,导致利润计算始终为0,而对于第一个例子,一旦锁定了一个历史低价,后续要做的就是不断与之后的价格比较,从中找到最大利润。
这个思路也叫动态规划,虽然我现在也不是很理解- - ,看后续做题能否积累,那么本文就到这里就结束了。
JS leetcode 买卖股票的最佳时机 题解分析,我离职了。的更多相关文章
- LeetCode 买卖股票的最佳时机 II
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你可以尽可能地完成更多的交易(多次买卖一支股票). 注意:你不能同时参与多笔交易(你必须在再次 ...
- LeetCode 买卖股票的最佳时机
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润. 注意你不能在买入股票前卖出股票. 示例 ...
- 【LeetCode】714、买卖股票的最佳时机含手续费
Best Time to Buy and Sell Stock with Transaction Fee 题目等级:Medium 题目描述: Your are given an array of in ...
- LeetCode《买卖股票的最佳时机》系列题目,最详解
目录 说在前面 引例:只能交易一次 一.动态数组定义 二.状态转移方程 三.初始化 四.优化 无限制买卖 一.动态数组定义 二.状态转移方程 三.初始化 四.优化 交易 2 次,最大利润? 一.动态数 ...
- Leetcode 188.买卖股票的最佳时机IV
买卖股票的最佳时机IV 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你最多可以完成 k 笔交易. 注意: 你不能同时参与多笔交易(你必 ...
- 【Leetcode】【简单】【122. 买卖股票的最佳时机 II】【JavaScript】
题目描述 122. 买卖股票的最佳时机 II 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你可以尽可能地完成更多的交易(多次买卖一支股票) ...
- 每日一题-——LeetCode(121)买卖股票的最佳时机
题目描述: 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格.如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润.注意你不能在买入股票前卖出股票 ...
- Leetcode之动态规划(DP)专题-121. 买卖股票的最佳时机(Best Time to Buy and Sell Stock)
Leetcode之动态规划(DP)专题-121. 买卖股票的最佳时机(Best Time to Buy and Sell Stock) 股票问题: 121. 买卖股票的最佳时机 122. 买卖股票的最 ...
- Leetcode之动态规划(DP)专题-122. 买卖股票的最佳时机 II(Best Time to Buy and Sell Stock II)
Leetcode之动态规划(DP)专题-122. 买卖股票的最佳时机 II(Best Time to Buy and Sell Stock II) 股票问题: 121. 买卖股票的最佳时机 122. ...
- Leetcode之动态规划(DP)专题-123. 买卖股票的最佳时机 III(Best Time to Buy and Sell Stock III)
Leetcode之动态规划(DP)专题-123. 买卖股票的最佳时机 III(Best Time to Buy and Sell Stock III) 股票问题: 121. 买卖股票的最佳时机 122 ...
随机推荐
- java项目实践-webapp-mytomcat-day16
目录 1. http协议 2. 自定义的web框架 3. 具体实现 4. 启动 1. http协议 CS架构 建立连接"三次握手" 断开连接 "四次挥手" 三次 ...
- Go socket 编程源码解析(上)
0. socket 介绍 Liunx 中一切皆文件.通过文件描述符和系统调用号可以实现对任何设备的访问.同样的,socket 也是一种文件描述符.通过 socket 可以建立网络传输.对于 TCP 和 ...
- 如何使用Markdown编写笔记
Markdown是什么? Markdown 是一种轻量级标记语言,创始人为约翰·格鲁伯(John Gruber). 它允许人们使用易读易写的纯文本格式编写文档,然后转换成有效的 XHTML(或者HTM ...
- Redis 主从复制架构配置及原理
本文为博主原创,未经允许不得转载: 目录: 1. Redis 主从复制架构搭建 2. Redis 主从架构原理 3. Redis 断点续传 4. Jedis 连接 redis 主从架构一般配置一主多从 ...
- Autowired注入Service变成了biaomidou的Mapper代理
问题概述 一个Springboot工程,使用Mybatis-plus作为数据层框架 使用@MapperScan注解扫描Mapper接口 @MapperScan("org.net5ijy.cl ...
- 使用VS开发人员工具观察类在内存中的布局
1.先要生成相应文件 2.打开VS2019开发人员工具 3.cd至文件目录 4.输入cl /d1 reportSingleClassLayoutanimal demo.cpp 其中reportSing ...
- 【C/C++】 代码质量控制手段
问题引入 多人协作开发的项目,没有统一的代码规范,那么最终的编写状态必定风格迥异,产生的结果:对内,阅读审核代码是很痛苦的:对外,公司形象就是差. 单干的项目也必须要严格按照代码规范,因为最终还是会对 ...
- [转帖]oracle查询表变化量
根据变化量,可确定表的繁忙度,以及作为判断可能数据增长的对象. select obj.owner, obj.object_name, to_char(sn.BEGIN_INTERVAL_TIME,'y ...
- [转帖]浪潮PM8222-SHBA、RAID 2GB PM8204、RAID 4GB PM8204,阵列卡配置方法
1.8222和8204对比 这几个型号的阵列卡都很相似,配置方法也基本一样 8204就是在8222上的基础上增加了缓存,可以通过下图对比 正面8204比8222多一个掉电保护接口 8204背面多了几个 ...
- [转帖]TiKV & TiFlash 加速复杂业务查询
https://tidb.net/book/tidb-monthly/2022/2022-07/usercase/tikv-tiflash 背景 在互联网公司或传统公司的 CRM 系统中,最常用的功 ...