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

223 阅读2分钟

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

image.png

题3

数据流的中位数

中位数是有序列表中间的数。如果列表长度是偶数,中位数则是中间两个数的平均值。

例如,

  • [2,3,4] 的中位数是 3

  • [2,3] 的中位数是 (2 + 3) / 2 = 2.5

设计一个支持以下两种操作的数据结构:

  • void addNum(int num) - 从数据流中添加一个整数到数据结构中。

  • double findMedian() - 返回目前所有元素的中位数。

示例:

  • addNum(1)

  • addNum(2)

  • findMedian() -> 1.5

  • addNum(3)

  • findMedian() -> 2 进阶:

  • 如果数据流中所有整数都在 0 到 100 范围内,你将如何优化你的算法?

  • 如果数据流中 99% 的整数都在 0 到 100 范围内,你将如何优化你的算法? 相关标签

  • 设计

  • 双指针

  • 数据流

  • 排序

  • 堆(优先队列)

这里使用堆,进行排序求解,很多人用大顶堆小顶堆,今天时间比较紧张,所有先不深入学习了,明天抽空再看一下

class MedianFinder:

    def __init__(self):
        self.stack = []

    def addNum(self, num: int) -> None:
        self.stack.append(num)


    def findMedian(self) -> float:
        self.stack.sort()  # 排序
        n = len(self.stack)
        if n & 1 == 1: # 判断 数组是奇偶
            return self.stack[n // 2] # 奇数取中间值
        else:
            return (self.stack[n // 2 - 1] + self.stack[n // 2]) / 2  # 偶数取两个数的和求平均值

# Your MedianFinder object will be instantiated and called as such:
# obj = MedianFinder()
# obj.addNum(num)
# param_2 = obj.findMedian()

执行结果:

image.png

题4

有序矩阵中第K小的元素

给你一个 n x n 矩阵 matrix ,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素。 请注意,它是 排序后 的第 k 小元素,而不是第 k 个 不同 的元素。 

示例 1:

  • 输入:matrix = [[1,5,9],[10,11,13],[12,13,15]], k = 8
  • 输出:13
  • 解释:矩阵中的元素为 [1,5,9,10,11,12,13,13,15],第 8 小元素是 13

示例 2:

  • 输入:matrix = [[-5]], k = 1
  • 输出:-5  

提示:

  • n == matrix.length
  • n == matrix[i].length
  • 1 <= n <= 300
  • -109 <= matrix[i][j] <= 109
  • 题目数据 保证 matrix 中的所有行和列都按 非递减顺序 排列
  • 1 <= k <= n2 相关标签
  • 数组
  • 二分查找
  • 矩阵
  • 排序
  • 堆(优先队列)

第一想法是把矩阵的数据都放在一个list里面然后排序,最后取第k个值就好了

class Solution:
    def kthSmallest(self, matrix: List[List[int]], k: int) -> int:
        alist = []
        for row in matrix:
            for i in row:
                alist.append(i)
        alist.sort()
        return alist[k-1]

执行结果:

image.png