小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
今天有人问到笔试碰到一道题:数组中从右减左求最大差值,我想到力扣有一道比较经典的题:买卖股票的最佳时机
这题比较简单,主要是能通过这道题逐渐了解动态规划、贪心算法等技巧
官方已经有很多题解,所以主要是提供做题的思路,从123到通过题解到最后如何优化来实现
先初步通过,再优化,首先有个思路
- 默认一个最小值,最大值,利润
- 通过遍历进行判断,更新最小值,最大值,利润
- 遍历完成后返回最终结果
/**
* @param {number[]} prices
* @return {number}
*/
var maxProfit = function (prices) {
// 默认一个最小值,最大值,利润
// 先定义第一天,循环中逐步对比
let min = prices[0]
let max = prices[0]
let res = 0
// 通过遍历进行判断,更新最小值,最大值,利润
for (let i = 1; i < prices.length; i++) {
if (min >= prices[i]) {
min = prices[i]
max = prices[i]
}
if(max <= prices[i]){
max = prices[i]
}
res = res > max-min ? res : max-min
}
// 遍历完成后返回最终结果
return res
};
这样是可以通过的,但是代码不够优雅,还可以继续优化
这里我是在遍历中通过max-min获取结果并更新,但其实可以直接用利润来计算
- 首先把max去掉,这里不用了
- 然后利用Math函数把第一个 if判断和内容更换成
min = Math.min(min, prices[i]),逻辑同理 - 再把第二个 if判断和内容更换成
res = Math.max(res, prices[i] - min),逻辑同理 - 去掉
res = res > max-min ? res : max-min - 最后返回结果
/**
* @param {number[]} prices
* @return {number}
*/
var maxProfit = function (prices) {
// 默认一个最小值,利润
// 先定义第一天,循环中逐步对比
let min = prices[0]
let res = 0
// 通过遍历进行判断,更新最小值,利润
for (let i = 1; i < prices.length; i++) {
min = Math.min(min, prices[i])
res = Math.max(res, prices[i] - min)
}
// 遍历完成后返回最终结果
return res
};
- 时间复杂度:O(n)
- 空间复杂度:O(1)