3
private static final Random RAND = new Random(0);5
public int kthLargestValue(int[][] matrix, int k) {6
var xor = convertToXorArray(matrix);7
var targetIdx = xor.length - k;8
sortPartially(xor, targetIdx, 0, xor.length);12
void sortPartially(int[] nums, int targetIdx, int origLo, int origHi) {13
if (origHi - origLo < 2) return;15
var pivotIdx = RAND.nextInt(origHi - origLo) + origLo;16
var pivot = nums[pivotIdx];17
swap(nums, origLo, pivotIdx);23
if (pivot < nums[mid]) swap(nums, mid, --hi);24
else if (pivot > nums[mid]) swap(nums, mid++, lo++);28
if (targetIdx < lo) sortPartially(nums, targetIdx, origLo, lo);30
sortPartially(nums, targetIdx, mid, origHi);33
void swap(int[] n, int p, int q) {39
int[] convertToXorArray(int[][] matrix) {40
var rows = matrix.length;41
var cols = matrix[0].length;42
var xor = new int[rows * cols];43
for (int r = 0; r < rows; r++) {44
for (int c = 0; c < cols; c++) {45
var xIdx = r * cols + c;46
xor[xIdx] = matrix[r][c];47
if (c > 0) xor[xIdx] ^= xor[xIdx - 1];51
for (int i = cols; i < xor.length; i++) xor[i] ^= xor[i - cols];