LC每日一题|20240526 - 1738. 找出第 K 大的异或坐标值
给你一个二维矩阵
matrix和一个整数k,矩阵大小为m x n由非负整数组成。矩阵中坐标
(a, b)的 值 可由对所有满足0 <= i <= a < m且0 <= j <= b < n的元素matrix[i][j](下标从 0 开始计数)执行异或运算得到。请你找出
matrix的所有坐标中第k大的值(k的值从 1 开始计数)。
提示:
m == matrix.lengthn == matrix[i].length1 <= m, n <= 10000 <= matrix[i][j] <= 10^61 <= k <= m * n
题目等级:Medium
解题思路
很简单的一道二维前缀和~
设f(X)为矩阵中元素X计算得来的值, 则对于以下矩阵
| A | B |
|---|---|
| C | D |
有 f(D) = D xor f(A) xor f(B) xor f(C)
所以我们只需要据此计算出矩阵中所有元素对应的值即可
因为最终要求我们求取第k大的值,所以我们可以将二维数组坐标提前转为一维~
AC代码
class Solution {
fun kthLargestValue(matrix: Array<IntArray>, k: Int): Int {
val dp = IntArray(matrix.size * matrix[0].size)
for (i in matrix.indices) for (j in matrix[0].indices) {
dp[i * matrix[0].size + j] = matrix[i][j]
if (i > 0) dp[i * matrix[0].size + j] = dp[i * matrix[0].size + j] xor dp[(i - 1) * matrix[0].size + j]
if (j > 0) dp[i * matrix[0].size + j] = dp[i * matrix[0].size + j] xor dp[i * matrix[0].size + j - 1]
if (i > 0 && j > 0) dp[i * matrix[0].size + j] = dp[i * matrix[0].size + j] xor dp[(i - 1) * matrix[0].size + j - 1]
}
dp.sort()
return dp[dp.size - k]
}
}