题目(难度:简单):
根据每日 气温 列表,请重新生成一个列表,对应位置的输出是需要再等待多久温度才会升高超过该日的天数。如果之后都不会升高,请在该位置用 0 来代替。
输入: [73, 74, 75, 71, 69, 72, 76, 73]
输出: [1, 1, 4, 2, 1, 1, 0, 0]
气温 列表长度的范围是 [1, 30000]。每个气温的值的均为华氏度,都是在 [30, 100] 范围内的整数。
先阐述下题目的意思:
遍历数组
返回数组中 A 之后项第一个大于 A 的第一个数字的索引
填充索引到新数组中 A 对应的索引位置
/**
* @param {number[]} T
* @return {number[]}
*/
var dailyTemperatures = function (T) {
var len = T.length
var _result = Array(len).fill(0)
for (var i = 0; i < len; i++) {
var item = T[i]
if (item < 100) {
for (var j = i + 1; j < len; j++) {
if (T[j] > item) {
_result[i] = j - i
break
}
}
}
}
return _result
}
官方答案
暴力
/**
* @param {number[]} T
* @return {number[]}
*/
var dailyTemperatures = function (T) {
var length = T.length
var ans = Array(length).fill(0)
var next = Array(101).fill(Number.MAX_VALUE)
for (var i = length - 1; i >= 0; --i) {
var warmerIndex = Number.MAX_VALUE
for (var t = T[i] + 1; t <= 100; ++t) {
if (next[t] < warmerIndex) {
warmerIndex = next[t]
}
}
if (warmerIndex < Number.MAX_VALUE) {
ans[i] = warmerIndex - i
}
next[T[i]] = i
}
return ans
}
单调栈
/**
* @param {number[]} T
* @return {number[]}
*/
var dailyTemperatures = function (T) {
const res = new Array(T.length).fill(0)
const stack = []
for (let i = T.length - 1; i >= 0; i--) {
while (stack.length && T[i] >= T[stack[stack.length - 1]]) {
stack.pop()
}
if (stack.length && T[i] < T[stack[stack.length - 1]]) {
res[i] = stack[stack.length - 1] - i
}
stack.push(i)
}
return res
}
高手在民间
/**
* @param {number[]} T
* @return {number[]}
*/
var dailyTemperatures = function (T) {
let res = new Array(T.length).fill(0)
let stack = []
for (let i = 0; i < T.length; i++) {
while (stack.length && T[i] > T[stack[stack.length - 1]]) {
let topIdx = stack.pop()
res[topIdx] = i - topIdx
}
stack.push(i)
}
return res
}