- 找出第 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:
/*
算法:先求matrix坐标所对应的值,使用前缀矩阵进行求解
vec[i][j] = vec[i][j-1] ^ matrix[i][j];
对于第K大,最优算法应该是快排
*/
int kthLargestValue(vector<vector<int>>& matrix, int k) {
int m = matrix.size();
if (m == 0) {
return 0;
}
int n = matrix[0].size();
vector<vector<int>> vec(m, vector<int>(n));
vector<int> res;
vec[0][0] = matrix[0][0];
res.push_back(-1*vec[0][0]);
for (int i = 1; i < m; i++) {
vec[i][0] = vec[i-1][0] ^ matrix[i][0];
// cout << i << " " << 0 << " " << vec[i][0] << " ";
res.push_back(-1*vec[i][0]);
}
for (int i = 1; i < n; i++) {
vec[0][i] = vec[0][i-1] ^ matrix[0][i];
res.push_back(-1*vec[0][i]);
}
// cout << endl;
for (int i = 1; i < m; i++ ) {
for (int j = 1; j < n; j++) {
// cout << vec[i][j-1] << vec[i-1][j] << vec[i-1][j-1] << matrix[i][j] << endl;
vec[i][j] = vec[i][j-1] ^ vec[i-1][j] ^ vec[i-1][j-1] ^ matrix[i][j];
// cout << vec[i][j] << "test ";
res.push_back(-1*vec[i][j]);
}
}
sort(res.begin(), res.end());
// for (auto i : res) {
// cout << i << " ";
// }
return -1*res[k-1];
}
};