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

思路:
还是前缀异或,只是这次变成了二维。
求第n大的数,我想的直接用小顶堆,限制它元素个数为k,那么最终留下来的就是最大的k个数,堆顶就是第k大的数了。
如果堆没有满就加进堆里,如果满了就判断要加入的元素是否大于堆顶,大于就pop再push.
也可以排序再取第k+1个元素,也可以用快速选择算法来找第k大的数。

代码:

class Solution {
public:
    int kthLargestValue(vector<vector<int>>& matrix, int k) {
        int r = matrix.size(),c = matrix[0].size();
        vector<vector<int> > xorpre(r+1,vector<int>(c+1));
        priority_queue<int,vector<int>,greater<int> > pq;
        for(int i=1;i<=r;++i){
            for(int j=1;j<=c;++j){
                xorpre[i][j]=xorpre[i-1][j]^xorpre[i][j-1]^xorpre[i-1][j-1]^matrix[i-1][j-1];
                if(pq.size()<k) pq.push(xorpre[i][j]);
                else if(xorpre[i][j]>=pq.top()&&pq.size()==k){
                    pq.pop();
                    pq.push(xorpre[i][j]);
                }
            }
        }
        return pq.top();

    }
};
posted @ 2021-05-19 20:16  Mrsdwang  阅读(39)  评论(0编辑  收藏  举报