leetCode5663. 找出第 K 大的异或坐标值

思路

本题就是二维前缀和的变形,把二维前缀和改为二维异或和

下图是y总算法基础课的二维前缀和的推导公式,就是容斥原理。

0
 
而本题目的异或,就是直接把加减号换为异或运算。因为异或运算就相当于不进位加法
最后再排下序找出第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 };

 

posted @ 2021-01-24 17:58  Uitachi  阅读(93)  评论(0编辑  收藏  举报