LeetCode 每日一题 :1738. 找出第 K 大的异或坐标值
分析
根据题意可得是要求所有以(0,0)为左上顶点的子矩阵异或和的第 K 大值。所以可以处理出一个二维前缀异或和,然后将所有值放入一个容器中取出第 K 大值(可以排序后求或者使用快速排序的思想来求)。
代码1
class Solution {
public int kthLargestValue(int[][] matrix, int k) {
int n = matrix.length;
int m = matrix[0].length;
ArrayList<Integer> v = new ArrayList<Integer>();
int[][] pre = new int[n + 1][m + 1];
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
pre[i][j] = pre[i - 1][j] ^ pre[i][j - 1] ^ pre[i - 1][j - 1] ^ matrix[i - 1][j - 1]; v.add(pre[i][j]);
}
}
Collections.sort(v, new Comparator<Integer>() {
public int compare(Integer o1, Integer o2) {
return o2 - o1;
}
});
return v.get(k - 1);
}
}
代码2
class Solution {
public int kthLargestValue(int[][] matrix, int k) {
int n = matrix.length;
int m = matrix[0].length;
int[][] pre = new int[n + 1][m + 1];
ArrayList<Integer> v = new ArrayList<Integer>();
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
pre[i][j] = pre[i - 1][j] ^ pre[i][j - 1] ^ pre[i - 1][j - 1] ^ matrix[i - 1][j - 1];
v.add(pre[i][j]);
}
}
return quickSort(v, 0, v.size() - 1, k - 1);
}
public int quickSort(ArrayList<Integer> v, int l, int r, int k) {
if (l >= r) {
return v.get(l);
}
int x = v.get(l + r >> 1), i = l - 1, j = r + 1;
while (i < j) {
do i++; while (v.get(i) > x);
do j--; while (v.get(j) < x);
if (i < j) {
int t = v.get(i);
v.set(i, v.get(j));
v.set(j, t);
}
}
if (j >= k) {
return quickSort(v, l, j, k);
} else {
return quickSort(v, j + 1, r, k);
}
}
}