这是我参与11月更文挑战的第15天,活动详情查看:2021最后一次更文挑战
题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()
执行结果:
题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]
执行结果: