跟着leedcode刷算法 -- 堆、栈与队列1

209 阅读1分钟

这是我参与11月更文挑战的第14天,活动详情查看:2021最后一次更文挑战

image.png

题1

最小栈

设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。

  • push(x) —— 将元素 x 推入栈中。
  • pop() —— 删除栈顶的元素。
  • top() —— 获取栈顶元素。
  • getMin() —— 检索栈中的最小元素。

示例:

输入:

  • ["MinStack","push","push","push","getMin","pop","top","getMin"]
  • [[],[-2],[0],[-3],[],[],[],[]]

输出:

  • [null,null,null,null,-3,null,0,-2]

解释:

  • MinStack minStack = new MinStack();
  • minStack.push(-2);
  • minStack.push(0);
  • minStack.push(-3);
  • minStack.getMin(); --> 返回 -3.
  • minStack.pop();
  • minStack.top(); --> 返回 0.
  • minStack.getMin(); --> 返回 -2.  

提示:

  • pop、top 和 getMin 操作总是在 非空栈 上调用。 相关标签
  • 设计

这里使用双栈解法

class MinStack:

    def __init__(self):
        self.stack = []
        self.stack_new = []
    def push(self, x: int) -> None:
        self.stack.append(x)
        if not self.stack_new or x <= self.stack_new[-1]: 
            self.stack_new.append(x)
    def pop(self) -> None:
        val = -1
        if self.stack: 
            val = self.stack.pop()
        if val == self.stack_new[-1]: 
            self.stack_new.pop()
    def top(self) -> int:
        return self.stack[-1]
    def getMin(self) -> int:
        return self.stack_new[-1]


# Your MinStack object will be instantiated and called as such:
# obj = MinStack()
# obj.push(val)
# obj.pop()
# param_3 = obj.top()
# param_4 = obj.getMin()

执行结果:

image.png

题2

数组中的第K个最大元素

  • 给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。
  • 请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。

示例 1:

  • 输入: [3,2,1,5,6,4] 和 k = 2
  • 输出: 5

示例2: 

  • 输入: [3,2,3,1,2,4,5,5,6] 和 k = 4

  • 输出: 4   提示:

  • 1 <= k <= nums.length <= 104

  • -104 <= nums[i] <= 104

相关标签

  • 数组
  • 分治
  • 快速选择
  • 排序
  • 堆(优先队列)

简单想法 倒排然后取第k个值

class Solution:
    def findKthLargest(self, nums: List[int], k: int) -> int:
        nums.sort(reverse=True)
        return nums[k-1]

image.png

明显我们现在学习的堆栈不太适用上面的方法

还是用堆的思想来学习一下 这里学习一下小顶堆的方法进行开发

from heapq import *

class Solution:
    def findKthLargest(self, nums: List[int], k: int) -> int:
        res = []
        for row in range(len(nums)):
            heappush(res,nums[row])
            if row >= k: heappop(res)
        return res[0]

执行结果:

image.png