We compute the XOR for each coordinate using prefix XOR, similar to prefix sum but with XOR. Then, we collect all values and find the kth largest using a heap or sorting.
classSolution {
publicintkthLargestValue(int[][] matrix, int k) {
int m = matrix.length, n = matrix[0].length;
int[][] pre =newint[m+1][n+1];
List<Integer> vals =new ArrayList<>();
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
pre[i][j]= matrix[i-1][j-1]^ pre[i-1][j]^ pre[i][j-1]^ pre[i-1][j-1];
vals.add(pre[i][j]);
}
}
vals.sort(Collections.reverseOrder());
return vals.get(k-1);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
classSolution {
funkthLargestValue(matrix: Array<IntArray>, k: Int): Int {
val m = matrix.size; val n = matrix[0].size
val pre = Array(m+1) { IntArray(n+1) }
val vals = mutableListOf<Int>()
for (i in1..m) {
for (j in1..n) {
pre[i][j] = matrix[i-1][j-1] xor pre[i-1][j] xor pre[i][j-1] xor pre[i-1][j-1]
vals.add(pre[i][j])
}
}
vals.sortDescending()
return vals[k-1]
}
}
1
2
3
4
5
6
7
8
9
10
11
classSolution:
defkthLargestValue(self, matrix: list[list[int]], k: int) -> int:
m, n = len(matrix), len(matrix[0])
pre = [[0]*(n+1) for _ in range(m+1)]
vals = []
for i in range(1, m+1):
for j in range(1, n+1):
pre[i][j] = matrix[i-1][j-1] ^ pre[i-1][j] ^ pre[i][j-1] ^ pre[i-1][j-1]
vals.append(pre[i][j])
vals.sort(reverse=True)
return vals[k-1]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
impl Solution {
pubfnkth_largest_value(matrix: Vec<Vec<i32>>, k: i32) -> i32 {
let m = matrix.len();
let n = matrix[0].len();
letmut pre =vec![vec![0; n+1]; m+1];
letmut vals = Vec::new();
for i in1..=m {
for j in1..=n {
pre[i][j] = matrix[i-1][j-1] ^ pre[i-1][j] ^ pre[i][j-1] ^ pre[i-1][j-1];
vals.push(pre[i][j]);
}
}
vals.sort_unstable_by(|a, b| b.cmp(a));
vals[(k-1) asusize]
}
}