目录
单调栈
通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时我们就要想到可以用单调栈了
通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时我们就要想到可以用单调栈了
- 单调栈里存放的元素是什么?
单调栈里只需要存放元素的下标i就可以了,如果需要使用对应的元素,直接T[i]就可以获取。
739. 每日温度
result的定义,如果右边比左边大,就更新result。使用数组存储
然后需要使用栈来存放
有三种情况:
如果
- 情况一:当前遍历的元素T[i]小于栈顶元素T[st.top()]的情况。push进去栈
- 情况二:当前遍历的元素T[i]等于栈顶元素T[st.top()]的情况。push进去栈
- 情况三:当前遍历的元素T[i]大于栈顶元素T[st.top()]的情况。pop出去,然后更新result,计算result[st.top()] = i-st.top()
class Solution:
def dailyTemperatures(self, temperatures: List[int]) -> List[int]:
#存储结果
result = [0]*len(temperatures)
#使用栈
stack = []
stack.append(0)
for i in range(1,len(temperatures)):
#如果小于
if temperatures[i] <= temperatures[stack[-1]]:
stack.append(i)
else:
while len(stack)!=0 and temperatures[i] > temperatures[stack[-1]]:
result[stack[-1]] = i-stack[-1]
stack.pop()
stack.append(i)
return result
二刷:(未ac)
var dailyTemperatures = function (temperatures) {
let result = new Array(temperatures.length).fill(0)
let stack = []
stack.push(0)
for (let i = 1; i < temperatures.length; i++) {
const top = stack[stack.length -1]
if (temperatures[i] < temperatures[top]) {
stack.push(i)
} else if (temperatures[i] === temperatures[top]) {
stack.push(i)
} else {
while (stack.length && temperatures[i] > temperatures[stack[stack.length-1]]){
let temp = stack.pop()
// 加入结果
result[temp] = i-temp
}
stack.push(i)
}
}
return result
};
496.下一个更大元素 I
class Solution:
def nextGreaterElement(self, nums1: List[int], nums2: List[int]) -> List[int]:
result = [-1]*len(nums1)
stack = [0]
#判断nums2中每个元素的左边和右边是否有比他大的数字
#根据nums2所对应的数存入result数组中
for i in range(1,len(nums2)):
#如果新的数小于等于栈顶元素
if nums2[i] <= nums2[stack[-1]]:
stack.append(i)
else:
#需要保证stack非空
while len(stack) != 0 and nums2[i] > nums2[stack[-1]]:
#存入结果
if nums2[stack[-1]] in nums1:
getindex = nums1.index(nums2[stack[-1]])
result[getindex] = nums2[i]
stack.pop()
stack.append(i)
return result
本题和 739. 每日温度 看似差不多,其实 有加了点难度。
二刷(未ac)
自己写的,过了12个testcase,不知道哪里有问题,可能是时间太长了
var nextGreaterElement = function(nums1, nums2) {
let stack = []
let result = new Array(nums1.length).fill(-1)
console.log(result)
for(let i = 0;i<nums1.length; i++){
//find index in nums2 according nums1
let index2 = nums2.indexOf(nums1[i])
stack.push(nums2[index2])
console.log(stack)
for(let j = index2+1;j<nums2.length;j++){
console.log(nums2[i])
if(nums2[j]<=stack[stack.length-1]){
stack.push(nums2[j])
}else{
while(stack.length && nums2[j]>stack[stack.length-1]){
result[i] = nums2[j]
stack = []
break
}
}
}
}
return result
};
正确题解:
var nextGreaterElement = function (nums1, nums2) {
let result = new Array(nums1.length).fill(-1)
let stack = []
stack.push(0)
let hashmap = {}
for(let i = 0;i<nums1.length;i++){
hashmap[nums1[i]]=i
}
console.log(hashmap)
for (let i = 1; i < nums2.length; i++) {
const top = stack[stack.length - 1]
if (nums2[i] < nums2[top]) {
stack.push(i)
} else if (nums2[i] === nums2[top]) {
stack.push(i)
} else {
while (stack.length && nums2[i] > nums2[stack[stack.length - 1]]) {
if(nums2[stack[stack.length - 1]] in hashmap){
let index = hashmap[nums2[stack[stack.length - 1]]]
result[index] = nums2[i]
}
stack.pop()
}
stack.push(i)
}
}
return result
};