378.有序矩阵中第K小的元素
链接:378.有序矩阵中第K小的元素
难度:Medium
标签:数组、二分查找、矩阵、排序、堆(优先队列)
简介:给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素。
题解 1 - typescript
- 编辑时间:2020-07-02
- 执行用时:100ms
- 内存消耗:52.8MB
- 编程语言:typescript
- 解法介绍:构建小顶堆进行读取。
class Heap {
get size(): number {
return this._elemenets.length;
}
constructor(private _elemenets: number[]) {
this.heapify();
}
heapify(): void {
for (let i = (this.size >> 1) - 1; i >= 0; i--) {
this.siftDown(i);
}
}
remove(): number {
const root = this._elemenets[0];
this._elemenets[0] = this._elemenets.pop() as number;
this.siftDown(0);
return root;
}
siftDown(index: number) {
const element = this._elemenets[index];
const half = this.size >> 1;
while (index < half) {
let childIndex = (index << 1) + 1;
let child = this._elemenets[childIndex];
const rightIndex = childIndex + 1;
if (rightIndex < this.size && this._elemenets[rightIndex] < child) {
child = this._elemenets[(childIndex = rightIndex)];
}
if (element <= child) break;
this._elemenets[index] = child;
index = childIndex;
}
this._elemenets[index] = element;
}
}
function kthSmallest(matrix: number[][], k: number): number {
const heap = new Heap(matrix.reduce((total, value) => total.concat(value), []));
while (--k !== 0) {
heap.remove();
}
return heap.remove();
}
题解 2 - c
- 编辑时间:2021-11-30
- 执行用时:32ms
- 内存消耗:8.1MB
- 编程语言:c
- 解法介绍:二分查找,根据矩阵有序特性。
int check(int **matrix, int n, int num) {
int row = n - 1, col = 0, cnt = 0;
while (row >= 0) {
while(col < n && matrix[row][col] <= num) col++;
cnt += col;
row--;
}
return cnt;
}
int kthSmallest(int** matrix, int matrixSize, int* matrixColSize, int k){
int l = matrix[0][0], r = matrix[matrixSize - 1][matrixSize - 1], m;
while (l < r) {
m = (l + r) >> 1;
int cnt = check(matrix, matrixSize, m);
if (cnt >= k) r = m;
else l = m + 1;
}
return l;
}
题解 3 - typescript
- 编辑时间:2020-07-02
- 执行用时:112ms
- 内存消耗:51.4MB
- 编程语言:typescript
- 解法介绍:拍平后排序输出。
function kthSmallest(matrix: number[][], k: number): number {
return matrix.reduce((total, value) => total.concat(value), []).sort((a, b) => a - b)[k - 1];
}