1738. 找出第 K 大的异或坐标值
题目链接
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-kth-largest-xor-coordinate-value/
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题目描述
给你一个二维矩阵 matrix 和一个整数 k ,矩阵大小为 m x n 由非负整数组成。
矩阵中坐标 (a, b) 的 值 可由对所有满足 0 <= i <= a < m 且 0 <= j <= b < n 的元素 matrix[i][j](下标从 0 开始计数)执行异或运算得到。
请你找出 matrix 的所有坐标中第 k 大的值(k 的值从 1 开始计数)。
示例 1:
输入:matrix = [[5,2],[1,6]], k = 1
输出:7
解释:坐标 (0,1) 的值是 5 XOR 2 = 7 ,为最大的值。
示例 2:
输入:matrix = [[5,2],[1,6]], k = 2
输出:5
解释:坐标 (0,0) 的值是 5 = 5 ,为第 2 大的值。
示例 3:
输入:matrix = [[5,2],[1,6]], k = 3
输出:4
解释:坐标 (1,0) 的值是 5 XOR 1 = 4 ,为第 3 大的值。
示例 4:
输入:matrix = [[5,2],[1,6]], k = 4
输出:0
解释:坐标 (1,1) 的值是 5 XOR 2 XOR 1 XOR 6 = 0 ,为第 4 大的值。
提示:
- m == matrix.length
- n == matrix[i].length
- 1 <= m, n <= 1000
- 0 <= matrix[i][j] <= 106
- 1 <= k <= m * n
题目分析
- 根据题目描述,定义(i,j)的值是前j列中前i个数字的异或,选取第k大的值
- 使用动态规划的思想,假设f(x,y)=f(x-1,y-1)XORf(x-1,y)XORf(x,y-1)XORmatrix[i][j]
- 边界条件:
当x=0,y=0时,f(x,y)=matrix[0][0]
当x=0时,f(x,y)=f(x,y-1)XORmatrix[x][y]
当y=0时,f(x,y)=f(x-1,y)XORmatrix[x][y]
代码
class Solution {
public:
int kthLargestValue(vector<vector<int>>& matrix, int k) {
int m = matrix.size();
int n = matrix[0].size();
vector<vector<int>> dp(m, vector<int>(n, 0));
vector<int> num;
dp[0][0] = matrix[0][0];
num.push_back(dp[0][0]);
for (int j = 1; j < n; ++j) {
dp[0][j] = dp[0][j - 1] ^ matrix[0][j];
num.push_back(dp[0][j]);
}
for (int i = 1; i < m; ++i) {
dp[i][0] = dp[i - 1][0] ^ matrix[i][0];
num.push_back(dp[i][0]);
}
for (int i = 1; i < m; ++i) {
for (int j = 1; j < n; ++j) {
dp[i][j] = dp[i - 1][j - 1] ^ dp[i - 1][j] ^ dp[i][j - 1] ^ matrix[i][j];
num.push_back(dp[i][j]);
}
}
sort(num.begin(), num.end(), compare);
return num[k - 1];
}
private:
static bool compare(int a, int b) { return a > b; }
};