[1738] 找出第 K 大的异或坐标值


阅读量66

[1738] 找出第 K 大的异或坐标值

力扣原题链接
给你一个二维矩阵 matrix 和一个整数 k ,矩阵大小为 m x n 由非负整数组成。

矩阵中坐标 (a, b) 可由对所有满足 0 <= i <= a < m0 <= 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] <= 10<sup>6</sup>
  • 1 <= k <= m * n

题解

先计算每个坐标对应的值,再排序,获得第 K 大的值。计算每个坐标的值,可根据异或性质 a^b = c==>a^c = b 可得出:
依题意有:坐标(n,m)的值 =》 matrix[0][0] ^ matrix[0][1] ^ ... ^ matrix[0][m] ^ matrix[1][0] ^ ....^ matrix[n][m] ==> 坐标(n - 1, m) ^ 坐标(n,m - 1) ^ 坐标(n - 1,m - 1)^ matrix[n][m].
其中 坐标(n - 1,m - 1)的目的是用于抵消 坐标(n - 1, m) ^ 坐标(n,m - 1)中计算了两遍的其中一遍数据。

代码

class Solution { public: int kthLargestValue(vector<vector<int>>& matrix, int k) { if(matrix.empty()) return 0; int height = (int)matrix.size(); int weight = (int)matrix[0].size(); vector<vector<int>> tmp_resurt(height + 1,vector<int>(weight + 1,0)); vector<int> nums_list; for(int i = 1; i < (int)tmp_resurt.size(); ++i) { for(int j = 1; j < (int)tmp_resurt[i].size(); ++j) { tmp_resurt[i][j] = tmp_resurt[i - 1][j] ^ tmp_resurt[i][j - 1] ^ matrix[i - 1][j - 1] ^ tmp_resurt[i - 1][j - 1]; nums_list.push_back(tmp_resurt[i][j]); } } std::sort(nums_list.begin(),nums_list.end(),greater<int>()); return nums_list[k - 1]; } };

ty 2021年5月19日 14:01 收藏文档
本站总访问量10331
本站访客数10260人次