我正在尝试练习一些算法问题,但是我陷入了解决该问题的最佳方法。我显然可以嵌套for循环,但这似乎效率不高。我可以使用哈希图来跟踪温度和温度索引吗?
给出每日温度列表,生成一个列表,对于输入中的每一天,该列表将告诉您要等到温度升高才需要多少天。如果没有将来的日子,可以改用0。 例如,给定列表温度= [73,74,75,71,69,72,76,73],您的输出应为[1、1、4、2、1、1、0、0]。
答案 0 :(得分:1)
您可以使用几个不同的技巧。 @PlatypusMaximus试图将您指向一个从头开始进行迭代的方法,但是当您进行迭代时您也可以这样做,而且我认为这样更容易理解:
当您遍历数组时,将保留未分配“最近的温暖日”的索引列表。此列表最初是空的。
对于每个元素,从列表中删除所有具有较低温度的索引,然后将其“下一个较暖的日子”分配给当前索引。
到最后时,列表中剩余的所有索引都没有“在温暖的日子之后最近的索引”,并且得到0。
诀窍是:每当将元素添加到列表中时,所有前面的元素都相等或更大。因此,索引列表仍然按温度降序排序。在步骤(2)中,这意味着您只需要查看列表末尾的元素(可以使用堆栈),而不是对其进行搜索,结果是整个过程需要O(N)时间。
答案 1 :(得分:0)
您可以用零填充结果数组,并通过检查存储的值(作为对象中的键)和索引(作为值)来迭代给定的值。
如果找到的值大于临时对象中的值,则在索引处分配其他索引的增量,并从对象中删除此键。
以温度为键将每个索引分配给对象。
var data = [73, 74, 75, 71, 69, 72, 76, 73],
// [ 1, 1, 4, 2, 1, 1, 0, 0]
result = Array.from(data, _ => 0);
data.reduce((t, v, i) =>
t.filter(([w, j]) => {
if (w >= v) return true;
result[j] = i - j;
}).concat([[v, i]]),
[]
);
console.log(result);