You are given a 2D matrix of size m x n, consisting of non-negative integers. You are also given an integer k.
The value of coordinate (a, b) of the matrix is the XOR of all matrix[i][j] where 0 <= i <= a < m and 0 <= j <= b < n(0-indexed).
Find the kth largest value (1-indexed) of all the coordinates of matrix.
Example 1:
Input: matrix = [[5,2],[1,6]], k = 1
Output: 7
Explanation: The value of coordinate (0,1) is 5 XOR 2 = 7, which is the largest value.
Example 2:
Input: matrix = [[5,2],[1,6]], k = 2
Output: 5
Explanation: The value of coordinate (0,0) is 5 = 5, which is the 2nd largest value.
Example 3:
Input: matrix = [[5,2],[1,6]], k = 3
Output: 4
Explanation: The value of coordinate (1,0) is 5 XOR 1 = 4, which is the 3rd largest value.
Constraints:
m == matrix.length
n == matrix[i].length
1 <= m, n <= 1000
0 <= matrix[i][j] <= 106
1 <= k <= m * n
Solutions
Solution 1: Two-dimensional Prefix XOR + Sorting or Quick Selection
We define a two-dimensional prefix XOR array \(s\), where \(s[i][j]\) represents the XOR result of the elements in the first \(i\) rows and the first \(j\) columns of the matrix, i.e.,
\[
s[i][j] = \bigoplus_{0 \leq x \leq i, 0 \leq y \leq j} matrix[x][y]
\]
And \(s[i][j]\) can be calculated from the three elements \(s[i - 1][j]\), \(s[i][j - 1]\) and \(s[i - 1][j - 1]\), i.e.,
We traverse the matrix, calculate all \(s[i][j]\), then sort them, and finally return the \(k\)th largest element. If you don't want to use sorting, you can also use the quick selection algorithm, which can optimize the time complexity.
The time complexity is \(O(m \times n \times \log (m \times n))\) or \(O(m \times n)\), and the space complexity is \(O(m \times n)\). Here, \(m\) and \(n\) are the number of rows and columns of the matrix, respectively.