题目
image.png解法一:
思路:输出的最后一位一定是0,从右往左遍历温度表T,如果当前温度T[i]
小于上一次温度T[i + 1]
,则记录1,否则从上次记录的最大值开始往左遍历,找到最近的比当前值大的温度,记录index
/**
* @param {number[]} T
* @return {number[]}
*/
var dailyTemperatures = function(T) {
let len = T.length;
let index = len - 1;
let max = T[len - 1];
let dp = new Array(len);
dp[len - 1] = 0;
for(let i = len - 2; i >= 0; i--) {
if (T[i + 1] > T[i]) {
dp[i] = 1;
} else {
if (T[i] >= max) {
dp[i] = 0;
max = T[i];
index = i;
} else {
dp[i] = index - i;
tmpIndex = index;
while(tmpIndex > i) {
if (T[tmpIndex] > T[i]) {
dp[i] = tmpIndex - i;
}
tmpIndex--;
}
}
}
}
return dp;
};
解法2:
从左往右遍历温度表,用一个栈来存放温度值与index的信息,如果当前遍历的值小于栈最后的元素值,则把当前元素推入栈内,否则依次把当前值与栈的最后元素对比,如果当前值大于栈的最后一位元素值,则栈推出最后一位,并记录该位置的距离i - item.index
,直到栈的最后一位元素值大于等于当前遍历值,才把当前值放入栈中。最后不要忘了把res
中为空的元素替换成0
。
/**
* @param {number[]} T
* @return {number[]}
*/
var dailyTemperatures = function(T) {
let stack = [{val: T[0], index: 0}];
let res = new Array(T.length);
for (let i = 1; i < T.length; i++) {
if (T[i] > stack[stack.length - 1].val) {
let flag = true;
while(flag) {
if (stack.length > 0 && stack[stack.length - 1].val < T[i]) {
let item = stack.pop();
res[item.index] = i - item.index;
} else {
stack.push({val: T[i], index: i})
flag = false;
}
}
} else {
stack.push({val: T[i], index: i})
}
};
for (let i = 0; i < res.length; i++) {
if (res[i] === undefined) {
res[i] = 0;
}
}
return res;
};
网友评论