找指定元素后面比它大的元素
题目描述: nums1是nums2的子串,找到nums1中每个元素在nums2中的位置,如果该元素的后面存在比它更大的元素,就返回这个更大的元素,否则返回-1.
思路: 构建一个字典 cache和一个列表st。首先遍历nums2,如果nums2中的元素是降序顺序,则依次存入st,如果nums2中出现了升序(也就是后一个元素x比前一个元素st[-1]大的情况),我们将这个结果存入字典中,cache[st.pop()] = x
,这样根据cache的键(小的元素)就可以得到它的值(大的元素)(注意,这里一定要将st中的最后一个元素pop出来,否则每次循环的判断条件st[-1]都是同一个值,会陷入死循环!)
class Solution:
def nextGreaterElement(self, nums1, nums2):
"""
:type nums1: List[int]
:type nums2: List[int]
:rtype: List[int]
"""
cache,st = {},[]
for x in nums2:
while st and st[-1]<x:
cache[st.pop()]=x
st.append(x) #这句也不能省,刚开始的时候st是空的,不会进入while循环
res = [-1]*len(nums1)
for i,num in enumerate(nums1):
if num in cache.keys():
res[i] = cache[num]
return res
用队列实现栈
只能使用队列的前进先出特性,我创建了两个空列表,当做队列使用(但是不能使用列表的pop功能哦,因为pop本身就是弹出顶部元素,也就是说列表本身就是具有栈的属性的,这样相当于作弊呀~)
【注意】最需要注意的应该是pop()函数,将q1中的元素依次挪到q2里面去,挪一个删一个,直至剩下最后一个元素,那个就是需要弹出的元素了(队列的尾部,就是栈的栈顶),将这个元素赋给res作为返回值,这个元素也记得一并删掉!!删完之后,再将q2里的元素依次挪回q1里。
【总结】也就是说,q2队列只是在pop的时候用来暂存一下队列前面的数据,pop完后还要再放回q1里去的。其余几个函数压根就没有用到q2.
class MyStack:
def __init__(self):
"""
Initialize your data structure here.
"""
self.q1 = []
self.q2 = []
def push(self, x):
"""
Push element x onto stack.
:type x: int
:rtype: void
"""
return self.q1.append(x)
def pop(self):
"""
Removes the element on top of the stack and returns that element.
:rtype: int
"""
if len(self.q1)==0:return
else:
for i in range(len(self.q1)-1):
self.q2.append(self.q1[0])
del self.q1[0]
res = self.q1[0]
del self.q1[0]
while(self.q2):
self.q1.append(self.q2[0])
del self.q2[0]
return res
def top(self):
"""
Get the top element.
:rtype: int
"""
return self.q1[-1]
def empty(self):
"""
Returns whether the stack is empty.
:rtype: bool
"""
return True if len(self.q1)==0 else False
返回栈中最小元素的函数
leetcode 155. Min Stack
这个题目的关键点就是这个getMin()函数的设计,如果选择从头遍历的话,复杂度太高了(因为每次其实增删的也就是最顶部的那个别元素而已,栈底的大多数元素其实是没有变的)。所以有一种很巧妙的办法,就是push的时候,将当前值和当前最小值 绑定,同时append进去。在调用getMin()函数的时候,只需要返回栈顶的”当前最小值“即可。
https://leetcode.com/problems/min-stack/discuss/49183/Python-one-stack-solution-without-linklist
class MinStack:
def __init__(self):
"""
initialize your data structure here.
"""
self.stack = []
def push(self, x):
"""
:type x: int
:rtype: void
"""
if not self.stack:
self.stack.append((x,x))
else:
self.stack.append((x,min(x,self.stack[-1][1])))
def pop(self):
"""
:rtype: void
"""
self.stack.pop()
def top(self):
"""
:rtype: int
"""
if self.stack:
return self.stack[-1][0]
else:
return None
def getMin(self):
"""
:rtype: int
"""
return self.stack[-1][1]