每日温度的两种解法
题目描述
给定一个数组T代表了未来几天里每天的温度值,要求返回一个新的数组D,D中的每个元素表示需要经过多少天才能等来温度的升高。给定T:[23,25,21,19,22,26,23]返回 D: [ 1, 4, 2, 1, 1, 0, 0]
暴力解法
var dailyTemperatures = function(T) {
let result=[];
const length=T.length;
T.forEach((element,index) => {
if(index===length-1){
result.push(0)
}
for(let i=index+1;i<length;i++){
if(element<T[i]){
result.push(i-index);
break;
}
if(i===length-1){
result.push(0)
}
}
});
return result;
};
暴力解法先循环整个给到的温度数组,每一个温度下标作为返回结果的下表,在每一个温度里面循环当前下标之后的元素,找到比当前温度大的值,把结果推送进结果数组,循环到最后的话。则等不来温度的升高。温度的最后一个元素是没有升高 可能性的。直接推0。
利用栈的解法
栈的特点是先进后出,所有的操作都必须在栈顶完成。
const dailyTemperatures = (T) => {
let tack = [];// 定义栈
let result=[]; // 定义返回结果
T.forEach((element, index) => {// 循环整个温度数
result[index]=0;// 结果数据中初始化为0
// tack[tack.length - 1] 栈顶存储每一天的温度下标
while(tack.length>0 && element>T[tack[tack.length - 1]]){
result[tack[tack.length - 1]] = index - tack[tack.length - 1];
tack.pop();
}
tack.push(index);// 依次将每个元素的下标进行入栈操作。
});
return result;
};
循环温度数组,我们会把每个元素入栈一次,在栈里的数据是最后结果的每个元素的下标,通过温度数组加栈顶的下标读取出来的值就是那一天的温度,和循环中当前的元素进行比较如果当前元素大于 栈顶的值,那么当前栈顶下标位置的升高天数就是当前循环温度下标减去栈顶下标,匹配到了。就将当前栈顶元素出栈,