LeetCode(19)找出第K大的异或坐标值(中等)

问题描述:

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

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

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

代码:

class Solution {
public int kthLargestValue(int[][] matrix, int k) {
int m = matrix.length, n = matrix[0].length;
int[][] pre = new int[m + 1][n + 1];
List<Integer> results = new ArrayList<Integer>();
for (int i = 1; i <= m; ++i) {
for (int j = 1; j <= n; ++j) {
pre[i][j] = pre[i - 1][j] ^ pre[i][j - 1] ^ pre[i - 1][j - 1] ^ matrix[i - 1][j - 1];
results.add(pre[i][j]);
}
}

Collections.sort(results, new Comparator<Integer>() {
public int compare(Integer num1, Integer num2) {
return num2 - num1;
}
});
return results.get(k - 1);
}
}

值得注意的:

由于pre[i][j]可以由pre[i-1][j]⊕pre[i][j-1]⊕matrix[i][j]得到 并且

我们将pre(i−1,j) 和pre(i,j−1) 进行按位异或运算后,由于对一个数 x 异或两次 yy,结果仍然为 x 本身,即:

x⊕y⊕y=x

因此 pre(i−1,j−1) 对应区域的按位异或结果被抵消,我们需要将其补上,并对位置 (i, j)(i,j) 的元素进行按位异或运算,这样就得到了 pre(i,j)。

设置pre[][]=int[m + 1][n + 1]放置接下来的 m 行和 n 列存储二维前缀和,直接得到数组下标

最后进行排序得到第k大的数值。

 

posted @ 2021-05-22 15:39  ash98  阅读(43)  评论(0)    收藏  举报