难度中等715
请根据每日 气温
列表,重新生成一个列表。对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用 0
来代替。
例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73]
,你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]
。
提示:气温
列表长度的范围是 [1, 30000]
。每个气温的值的均为华氏度,都是在 [30, 100]
范围内的整数。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-the-duplicate-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
这题第一个想法就是考虑到温度的范围是[30, 100],可以借助一个数组逆序遍历,记录某个温度出现的下标。对于某个温度t,只需找[t + 1, 100]之间的最小值减去当前下标,就是答案。
设列表长度为n,温度范围为m,则时间复杂度O(n*m),本题m较小,因此可以通过。
如果m较大,比如10^6,那么会超时,对于这种靠逆序可以搞定的题目,需要往单调栈方面去思考。
正序遍历,不断将下标加入单调栈中,每次入栈前和栈中存在的下标index的数进行比较,如果数更大则可以将已入栈的下标出栈并更新,如果数更小,则直接入栈不做处理。
时间复杂度O(n)。