每日溫度
力扣題目鏈接
利用單調棧:記錄遍歷過的元素
思路:
棧頂元素與當前遍歷的元素對比:
- 當前遍歷的元素>棧頂元素。記錄結果,彈出棧頂元素,重復此過程。
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
};