leetCode5663. 找出第 K 大的异或坐标值
思路
本题就是二维前缀和的变形,把二维前缀和改为二维异或和
下图是y总算法基础课的二维前缀和的推导公式,就是容斥原理。
而本题目的异或,就是直接把加减号换为异或运算。因为异或运算就相当于不进位加法
最后再排下序找出第K大,这里学到了stl中nth_element()方法,这个比sort快,时间复杂度为O(n)
代码
1 //开数组,保存二维前缀和 2 const int N = 1000010; 3 int q[N]; 4 class Solution { 5 public: 6 int kthLargestValue(vector<vector<int>>& w, int k) { 7 int n = w.size(), m = w[0].size(); 8 int cnt = 0; 9 for(int i = 0;i < n;i++){ 10 for(int j = 0;j < m;j++){ 11 //非上边界 12 if(i) w[i][j] = w[i-1][j] ^ w[i][j]; 13 //非左边界 14 if(j) w[i][j] = w[i][j-1] ^ w[i][j]; 15 if(i && j) w[i][j] = w[i-1][j-1] ^ w[i][j]; 16 q[cnt++] = w[i][j]; 17 } 18 } 19 k = cnt -k; 20 nth_element(q,q+k,q+cnt); 21 return q[k]; 22 } 23 24 };