壹 ❀ 引

昨天下班后,还是找经理提出了辞职,没有犹豫的裸辞,今天与人事的对话不小心被后台的同事听到,一下在公司传开了,下午我与同事们多人对线,被他们的消息轰炸....没错,我真的要走了。

因为什么原因呢?公司技术框架过于落后(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 买卖股票的最佳时机 题解分析,我离职了。的更多相关文章

  1. LeetCode 买卖股票的最佳时机 II

    给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你可以尽可能地完成更多的交易(多次买卖一支股票). 注意:你不能同时参与多笔交易(你必须在再次 ...

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

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

  3. 【LeetCode】714、买卖股票的最佳时机含手续费

    Best Time to Buy and Sell Stock with Transaction Fee 题目等级:Medium 题目描述: Your are given an array of in ...

  4. LeetCode《买卖股票的最佳时机》系列题目,最详解

    目录 说在前面 引例:只能交易一次 一.动态数组定义 二.状态转移方程 三.初始化 四.优化 无限制买卖 一.动态数组定义 二.状态转移方程 三.初始化 四.优化 交易 2 次,最大利润? 一.动态数 ...

  5. Leetcode 188.买卖股票的最佳时机IV

    买卖股票的最佳时机IV 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你最多可以完成 k 笔交易. 注意: 你不能同时参与多笔交易(你必 ...

  6. 【Leetcode】【简单】【122. 买卖股票的最佳时机 II】【JavaScript】

    题目描述 122. 买卖股票的最佳时机 II 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你可以尽可能地完成更多的交易(多次买卖一支股票) ...

  7. 每日一题-——LeetCode(121)买卖股票的最佳时机

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

  8. Leetcode之动态规划(DP)专题-121. 买卖股票的最佳时机(Best Time to Buy and Sell Stock)

    Leetcode之动态规划(DP)专题-121. 买卖股票的最佳时机(Best Time to Buy and Sell Stock) 股票问题: 121. 买卖股票的最佳时机 122. 买卖股票的最 ...

  9. 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. ...

  10. 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 ...

随机推荐

  1. ElasticSearch 映射类型及数据类型区分

    本文为博主原创,未经允许不得转载: 1.ES 中的映射可以分为动态映射和静态映射 动态映射:在关系数据库中,需要事先创建数据库,然后在该数据库下创建数据表,并创建表字段.类型.长度.主键等,最后才能基 ...

  2. AI正在改变人类社会 - 内容行业的衰落

    现在的 AI 技术,每天都在进化.我有一种感觉,普通人大概没意识到,它马上就要改变人类社会了. 历史上,这种事一再发生.在你不知不觉中,某些大事件悄悄酝酿,突然就冲击到了你的生活,将你的人生全部打乱, ...

  3. 程序&命名-执行环境

    开发程序执行环境 系统级别 -- 编译器或解释器 程序级别 -- 命令行参数.配置文件 执行级别 -- 进程.线程.协程运行时上下文(树(命名空间 -- 函数-局部变量.包或模块-全局变量)) 命令行 ...

  4. 最新版TikTok 抖音国际版解锁版 v33.1.4 去广告 免拔卡

    软件简介: 抖音国际版App是全球最受欢迎的短视频应用,抖音国际版TikTok(海外版)横扫全球下载量常居榜首.这是最新抖音国际版解锁版,无视封锁和下载限制,国内免拔卡,去除了广告,下载视频无水印(T ...

  5. [转帖]JVM随笔 --- 安全点(safe point)与 安全区域( safe region)

    https://zhuanlan.zhihu.com/p/461298916 11 人赞同了该文章 最近回顾 JVM safe point 与 safe region 又有一些新的感悟与收获,特别写篇 ...

  6. [转帖]CoreDNS loop 插件异常问题

    https://zhuanlan.zhihu.com/p/476611162   背景 最近有遇到一个客户集群,发现集群中的 CoreDNS 老是异常 (loop 插件检测到有回路后进行 panic) ...

  7. [转帖]命令行非明文密码连接 TiDB

    https://tidb.net/blog/6794a34b#%E6%96%B9%E5%BC%8F%E4%B8%80%EF%BC%9A%E5%91%BD%E4%BB%A4%E8%A1%8C%E8%BE ...

  8. [转帖]【基础】HTTP、TCP/IP 协议的原理及应用

    https://juejin.cn/post/6844903938232156167 前言 本文将持续记录笔者在学习过程中掌握的一些 HTTP .TCP/IP 的原理,以及这些网络通信技术的一些应用场 ...

  9. [转帖]深入理解mysql-第十二章 mysql查询优化-Explain 详解(下)

    我们前面两章详解了Explain的各个属性,我们看到的都是mysql已经生成的执行计划,那这个执行计划的是如何生成的?我们能看到一些过程指标数据吗?实际mysql贴心为我们提供了执行计划的各项成本评估 ...

  10. 【转帖】一文解析ethtool 命令的使用

    命令简介 ethtool命令用于查询和控制网络设备驱动程序和硬件设置,尤其是有线以太网设备,devname网卡的名称.网卡就像是交换机的一个端口,正常使用我们只是配置网卡IP地址等信息,网卡的速率.双 ...