每日温度
力扣题目链接
利用单调栈:记录遍历过的元素
思路:
栈顶元素与当前遍历的元素对比:
- 当前遍历的元素>栈顶元素。记录结果,弹出栈顶元素,重复此过程。
2.当前遍历的元素<=栈顶元素。将当前遍历的元素放入栈中。
var dailyTemperatures = function(temperatures) {
let stack = [];
let res = new Array(temperatures.length).fill(0);
stack.push(0);
for (let i = 0; i < temperatures.length; i++) {
const top = stack[stack.length - 1];
if (temperatures[top] >= temperatures[i]) {
//记录结果
stack.push(i);
} else {
while (
stack.length >= 1 &&
temperatures[stack[stack.length - 1]] < temperatures[i]
) {
let key = stack.pop();
res[key] = i - key;
}
stack.push(i);
}
}
return res;
};
下一个更大元素 I
leecode题目
跟上题的区别:套了个壳子;
遍历nums2数组,利用单调栈,获得当前元素的下一个更大元素。通过map查看nums1是否有当前元素,若有,在nums1下标的相应位置更新最近最大的元素。
var nextGreaterElement = function(nums1, nums2) {
let res=new Array(nums1.length).fill(-1)
let stack=[]
let map=new Map()
for(let i in nums1){
map.set(nums1[i],i)
}
stack.push(0)
for(let i=1;i<nums2.length;i++){
const top = stack[stack.length - 1];
if (nums2[top] >= nums2[i]) {
//记录结果
stack.push(i);
} else {
while (
stack.length >= 1 &&
nums2[stack[stack.length - 1]] < nums2[i]
) {
if(map.has(nums2[stack[stack.length-1]])){
let key = stack.pop();
let item=map.get(nums2[key])
res[item] = nums2[i];
}else {
break;
}
}
stack.push(i);
}
}
return res
};