Tags——stack

找指定元素后面比它大的元素

题目描述: 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]    

猜你喜欢

转载自blog.csdn.net/aaon22357/article/details/85259500