问题描述
问题如下:
假设您有一个数组,第i个元素是第i天给定股票的价格。
如果只允许您最多完成一笔交易(即买入和卖出一股股票),请设计一种算法以找到最大的利润。
请注意,您不能在买股票之前卖出股票。
我的解决方案不断返回不确定的信息,我不确定为什么。关于如何解决此问题以使其正确的任何想法?
var maxProfit = function(prices) {
var minNum = Math.min(...prices);
var indMin = prices.indexOf(minNum);
for (var ind = 0; ind > indMin && ind < prices.length ; ind++){
var maxNum = Math.max(...prices);
var profit = maxNum - minNum
return profit
}}
谢谢!
解决方法
您的循环在第一次迭代之前停止。进入循环的条件是ind > indMin && ind < prices.length
。在第一次迭代中,ind == 0
和indMin
至少为0
。由于ind > indMin
不能为真,因此循环立即结束。
您也不应该在循环内返回。您需要继续寻找更好的解决方案,并在最大化利润后最终返回。
您不能使用开始时发现的最低价格,因为它可能毕竟是您希望以获利的价格出售的所有价格。
使用嵌套循环。一个循环选择一个购买价格,然后内部循环找到获得最高利润的销售价格。
let profit = 0;
for (let pindex = 0; pindex < prices.length - 1; pindex++) {
for (let sindex = pindex + 1; sindex < prices.length; sindex++) {
if (prices[sindex] - prices[pindex]) > profit) {
profit = prices[sindex] - prices[pindex];
}
}
}
如果您想使用Math.max()
,则可以将其替换为内部循环。使用slice()
获取购买日期之后的所有价格。
let profit = 0;
prices.forEach((purchase_price,i) => {
let max_sale_price = Math.max(...prices.slice(i+1));
profit = Math.max(profit,max_sale_price - purchase_price);
});