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 ...
 
随机推荐
- 解决 idea maven plugins 报红波浪线
			
导入新项目到 idea 的时候,由于依赖的环境以及项目中 maven 编译所依赖的pom的版本不同,很多时候导入到idea的时候 maven Plugins 会出现报红的情况,这是由于maven仓库中 ...
 - FinalShell上传文件失败
			
1.问题 上传文件失败,如图所示,即使切换至root用户 2.解决方式 这里在建立SSH连接时,就必须使用root用户,而若使用普通用户,即使在其中切换至root用户,也无法上传. 所以重新建立一个r ...
 - 【SHELL】获取脚本输入参数
			
参数获取 EXEC_PARAMS=(${@:index}) 示例 ./do.sh test a b c d e f EXEC_PARAMS=(${@:0}) ./do.sh test a b c d ...
 - [转帖][github]Chinese-LLaMA-Alpaca Public
			
`https://github.com/ymcui/Chinese-LLaMA-Alpaca#%E6%A8%A1%E5%9E%8B%E4%B8%8B%E8%BD%BD` 以ChatGPT.GPT-4等 ...
 - 【转帖】route命令详解大全(route命令使用实例)
			
https://www.cxdtop.cn/n/225987.html 在实际的网络应用中,我们可能会遇到这样的网络环境,上外网我们使用的无线网络,内网我们使用的是有限网卡.在设置完成后会出现外网和内 ...
 - [转帖]gcc与makefile常用操作(绝对常用,也绝对够用)
			
makefile与gcc常用操作 一.温故知新 1.可执行程序的生成过程 2.gcc的常用操作 二.make操作 三.编写Makefile文件时常用操作 注意:在Makefile文件中 空格和缩进是完 ...
 - [转帖]@nginx多server及使用优化(php)
			
文章目录  一.nginx多server优先级  二.禁止IP访问页面  三.nginx的包含include  四.nginx 路径的alias和root  1.配 ...
 - [转帖]/etc/passwd文件 各个字段详解
			
转载自:https://www.sohu.com/a/320177323_505901 /etc/passwd文件: 系统用户配置文件,存储了系统中所有用户的基本信息,并且所有用户都可以对此文件执行读 ...
 - [转帖]018 磁盘 IO 性能监控 / 压测工具 (sar、iotop、fio、iostat)
			
https://my.oschina.net/u/3113381/blog/5465063 1 sar 命令查看当前磁盘 IO 读写 sar(System Activity Reporter 系统 ...
 - Mybatis 拦截器实现单数据源内多数据库切换 | 京东物流技术团队
			
物流的分拣业务在某些分拣场地只有一个数据源,因为数据量比较大,将所有数据存在一张表内查询速度慢,也为了做不同设备数据的分库管理,便在这个数据源内创建了多个不同库名但表完全相同的数据库,如下图所示: 现 ...