LC每日一题|20240526 - 1738. 找出第 K 大的异或坐标值

83 阅读1分钟

LC每日一题|20240526 - 1738. 找出第 K 大的异或坐标值

给你一个二维矩阵 matrix 和一个整数 k ,矩阵大小为 m x n 由非负整数组成。

矩阵中坐标 (a, b) 可由对所有满足 0 <= i <= a < m0 <= j <= b < n 的元素 matrix[i][j]下标从 0 开始计数)执行异或运算得到。

请你找出 matrix 的所有坐标中第 k 大的值(k 的值从 1 开始计数)。

提示:

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= m, n <= 1000
  • 0 <= matrix[i][j] <= 10^6
  • 1 <= k <= m * n

题目等级:Medium

解题思路

很简单的一道二维前缀和~

f(X)为矩阵中元素X计算得来的, 则对于以下矩阵

AB
CD

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]
    }
}