JZX轻语:简
LeetCode 1738 - 找出第K大的异或坐标值
发表于2024年05月26日
前缀和思路的二维+异或版本,可以就地使用原数组维护前缀和,即matrix[i][j]
为矩阵matrix
中(0, 0)
到(i, j)
的异或和,且matrix[i][j] = matrix[i-1][j] ^ matrix[i][j-1] ^ matrix[i-1][j-1] ^ matrix[i][j]
(因为matrix[i - 1][j - 1]
实际上都包含在matrix[i-1][j]
和matrix[i][j-1]
中,两者异或后相互抵消了,需要再异或一次)。然后使用排序或者堆来维护前k
大的值即可。
import heapq
class Solution:
def kthLargestValue(self, matrix: List[List[int]], k: int) -> int:
pq = []
for i in range(len(matrix)):
for j in range(len(matrix[i])):
matrix[i][j] = (
(matrix[i - 1][j] if i > 0 else 0) ^
(matrix[i][j - 1] if j > 0 else 0) ^
(matrix[i - 1][j - 1] if i > 0 and j > 0 else 0) ^
matrix[i][j]
)
heapq.heappush(pq, matrix[i][j])
if len(pq) > k:
heapq.heappop(pq)
return pq[0]