JS:在迭代此数组时,可以使用哈希映射来跟踪吗?

时间:2018-08-11 20:17:21

标签: javascript algorithm

我正在尝试练习一些算法问题,但是我陷入了解决该问题的最佳方法。我显然可以嵌套for循环,但这似乎效率不高。我可以使用哈希图来跟踪温度和温度索引吗?

给出每日温度列表,生成一个列表,对于输入中的每一天,该列表将告诉您要等到温度升高才需要多少天。如果没有将来的日子,可以改用0。 例如,给定列表温度= [73,74,75,71,69,72,76,73],您的输出应为[1、1、4、2、1、1、0、0]。

2 个答案:

答案 0 :(得分:1)

您可以使用几个不同的技巧。 @PlatypusMaximus试图将您指向一个从头开始进行迭代的方法,但是当您进行迭代时您也可以这样做,而且我认为这样更容易理解:

  1. 当您遍历数组时,将保留未分配“最近的温暖日”的索引列表。此列表最初是空的。

  2. 对于每个元素,从列表中删除所有具有较低温度的索引,然后将其“下一个较暖的日子”分配给当前索引。

  3. 到最后时,列表中剩余的所有索引都没有“在温暖的日子之后最近的索引”,并且得到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);