javascript - 不知道为什么这个解决方案返回未定义(数组算法)
问题描述
问题如下:
假设您有一个数组,其中第 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);
});
推荐阅读
- java - 如何使用 Spark 在 Zeppelin 中定期刷新?(爪哇)
- stream - gRPC流式服务只能有一个参数的原因
- blockchain - 是否可以将区块链与领域数据库一起用于 Android 应用程序
- excel - 忽略以特殊字符为前缀的字符串
- javascript - 如何在呈现的表上切换状态 - React Js
- ios - iOS 13 - 如何检查用户是否已接受蓝牙权限?
- c++ - Why a pointer is unmutated even after passed to a function as reference?
- c# - 我不知道,为什么服务器响应错误代码 400
- laravel - Validation of entering numbers
- ios - UIViewController 自动旋转手动布局