1738.找出第K大的异或坐标值
链接:1738.找出第K大的异或坐标值
难度:Medium
标签:位运算、数组、分治、矩阵、前缀和、快速选择、排序、堆(优先队列)
简介:请你找出 matrix 的所有坐标中第 k 大的值(k 的值从 1 开始计数)。
题解 1 - typescript
- 编辑时间:2021-05-19
- 执行用时:736ms
- 内存消耗:105.1MB
- 编程语言:typescript
- 解法介绍:前缀和。
function kthLargestValue(matrix: number[][], k: number): number {
const rowLen = matrix.length;
const colLen = matrix[0].length;
const prefixSumList: number[][] = new Array(rowLen + 1)
.fill(0)
.map(_ => new Array(colLen + 1).fill(0));
const list: number[] = [];
for (let row = 1; row <= rowLen; row++) {
for (let col = 1; col <= colLen; col++) {
list.push(
(prefixSumList[row][col] =
prefixSumList[row - 1][col] ^
prefixSumList[row][col - 1] ^
prefixSumList[row - 1][col - 1] ^
matrix[row - 1][col - 1])
);
}
}
return list.sort((a, b) => b - a)[k - 1];
}
题解 2 - python
- 编辑时间:2024-05-26
- 执行用时:770ms
- 内存消耗:61.8MB
- 编程语言:python
- 解法介绍:前缀和存储异或值后,利用堆排序。
class Solution:
def kthLargestValue(self, matrix: List[List[int]], k: int) -> int:
n, m = len(matrix), len(matrix[0])
sums = [[0] * (m + 1) for _ in range(n + 1)]
q = []
for i in range(1, n + 1):
for j in range(1, m + 1):
sums[i][j] = sums[i - 1][j] ^ sums[i][j - 1] ^ sums[i - 1][j - 1] ^ matrix[i - 1][j - 1]
heappush(q, -sums[i][j])
for _ in range(k - 1): heappop(q)
return -q[0]