力扣的 121 题: 使用 js 解题
题目要求:
给定一个数组,它的第 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。
如果亏了,就不进行买卖,利润为 0;
错误:
首先自己做的时候,以为 找出数组的最大值 和 最小值,然后用 最大值 减 最小值,就可以得出 最大的总利润,之后发现是错误的;
以第一个为例:
不能单纯的找出最小值 和 最大值; [2,4,1]
,这个就不能得出 最大利润,如果找到最大值 - 最小值,2 - 1 = 1
;但这个股票的最大利润就为: 4 - 2 = 2
;
我们可以用当前的 值 减去 他左侧的最小值,就可以得出 卖出股票时,所得的利润了。
比如说:
当前为 7,他的左侧最小值也为 7, 7 - 7 = 0;
当前为 1,他的左侧最小值也为 1, 1 - 1 = 0;
当前为 5,他的左侧最小值也为 1, 5 - 1 = 4;
当前为 3,他的左侧最小值也为 1, 3 - 1 = 2;
当前为 6,他的左侧最小值也为 1, 6 - 1 = 5;
当前为 4,他的左侧最小值也为 1, 4 - 1 = 3;
我们可以看得出来,如果在 1 的时候买入,6 的时候卖出就可以得到 最大的利润 5;
我们就可以写代码了:
我们还是以 [7,6,4,3,1]
为例
var maxProfit = function(prices) {
// 记录左侧的最小值
let min = 0;
// 记录总利润
let profit = 0;
// 判断长度是否为 0,如果为0,那么就没有利润
if (prices.length == 0) {
return 0;
}
// 假设数组的第一个值为 最小值
min = prices[0]; // 7
// 循环数组
for (let i = 0; i < prices.length; i++) {
// 如果后面有一个值,最小值还小,就把他赋值为最小值
if (prices[i] < min) {
min = prices[i]; // 1,
}
// 如果当前的总利润 大于 之前的总利润,就确定他为新的总利润
if (prices[i] - min > profit) {
profit = prices[i] - min;
}
}
return profit;
};
当前值 | 7 | 1 | 5 | 3 | 6 | 4 |
---|---|---|---|---|---|---|
prices[i] - min | 7-7 = 0 | 1 - 1 = 0 | 5 - 1 = 4 | 3 - 1 = 2 | 6 - 1 = 5 | 4 - 1 = 3 |
profit | 0 | 0 | 4 | 4 | 5 | 5 |
参考: