leetcode—11.队列题型python解答

文章目录

      • 125. 验证回文串
      • 232. 用栈实现队列
      • 239. 滑动窗口最大值

125. 验证回文串

  这里使用双端队列来解决回文串问题

给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。

class Solution:
    def isPalindrome(self, s: str) -> bool:
        s = s.lower()
        # 检测字母与数字字符
        s = [i for i in s if i.isalpha() or i.isnumeric()]
        # 构造双端队列
        deque = collections.deque()
        # 回文词入对
        for i in s:
            deque.appendleft(i)
        state = True
        while len(deque) > 1 and state:
            left = deque.popleft()
            right = deque.pop()
            if left != right:
                state = False
        return state

232. 用栈实现队列

请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):
实现 MyQueue 类:
void push(int x) 将元素 x 推到队列的末尾
int pop() 从队列的开头移除并返回元素
int peek() 返回队列开头的元素
boolean empty() 如果队列为空,返回 true ;否则,返回 false
说明:
你只能使用标准的栈操作 —— 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。
你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。

解法一:在一个栈中维持所有元素的出队顺序思路

第一种方式是在一个栈中维持所有元素的出队顺序,即所有的元素在入队操作完成后只会保存在一个栈中,且其出栈的顺序和出队的顺序是一致的。通俗理解来说,相当于一个栈是中间容器

class MyQueue:

    def __init__(self):
        """
        Initialize your data structure here.
        """
        self._s1,self._s2 = [],[]

    def push(self, x: int) -> None:
        """
        Push element x to the back of queue.
        """
        # 为了维持栈1的出队顺序,当栈1中有元素,后续还要添加元素,需要先将栈1中的元素移到栈2,等栈1添加完之后,再将栈1的元素添加到栈1
        while self._s1:
            self._s2.append(self._s1.pop())
        self._s1.append(x)
        while self._s2:
            self._s1.append(self._s2.pop())

    def pop(self) -> int:
        """
        Removes the element from in front of queue and returns that element.
        """
        return self._s1.pop()

    def peek(self) -> int:
        """
        Get the front element.
        """
        return self._s1[-1]

    def empty(self) -> bool:
        """
        Returns whether the queue is empty.
        """
        return self._s1 == []

解法二:一个栈入,一个栈出
思路:

解法二的实现方式与解法一有点不同,按照功能的不同,解法二将两个栈一个用于入队,—个用于出队。假设栈inStack 用于实现入队操作,栈outStack 用于实现出队操作。

class MyQueue:

    def __init__(self):
        """
        Initialize your data structure here.
        """
        # self,_front用于存储入栈的栈首元素
        self._in_stack,self._out_stack,self._front = [],[],None

    def push(self, x: int) -> None:
        """
        Push element x to the back of queue.
        """
        # 保存入栈的栈首元素
        if not self._in_stack:
            self._front = x
        self._in_stack.append(x)

    def pop(self) -> int:
        """
        Removes the element from in front of queue and returns that element.
        """
        if self.empty():
            raise Exception('The queue is empty!')
        # 将输入栈元素全部添加到输出栈
        if not self._out_stack:
            while self._in_stack:
                self._out_stack.append(self._in_stack.pop())
        return self._out_stack.pop()

    def peek(self) -> int:
        """
        Get the front element.
        """
        if self.empty():
            raise Exception('The queue is empty!')

        if not self._out_stack:
            return self._front
        else:
            return self._out_stack[-1]

    def empty(self) -> bool:
        """
        Returns whether the queue is empty.
        """
        return self._in_stack == [] and self._out_stack == []

239. 滑动窗口最大值

给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值

示例:

输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3
输出: [3,3,5,5,6,7]
解释:
滑动窗口的位置 最大值


[1 3 -1] -3 5 3 6 7 3
1 [3 -1 -3] 5 3 6 7 3
1 3 [-1 -3 5] 3 6 7 5
1 3 -1 [-3 5 3] 6 7 5
1 3 -1 -3 [5 3 6] 7 6
1 3 -1 -3 5 [3 6 7] 7

class Solution:
    def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
        res = []  # 存储结果
        # 双端队列,两端快速添加(append)和弹出(pop),维护的是窗口内最大值的索引
        queue = collections.deque()  
        for i, num in enumerate(nums):
            # 将不在窗口内的最大值的索引弹出
            if queue and queue[0] == i - k:
                queue.popleft()
            # 如果队尾的值比num小,则直接弹出
            while queue and nums[queue[-1]] < num:
                queue.pop()
            # 队尾添加元素
            queue.append(i)
            # 每个窗口保存一个最大值
            if i >= k - 1:
                res.append(nums[queue[0]])
        return res

你可能感兴趣的:(#,LeetCode刷题,队列,leetcode,python)