1738. 找出第 K 大的异或坐标值
1.前置异或
2.kth-element问题:手撸快排;手撸堆排序;sort排序或者优先队列。
前置题 215. 数组中的第K个最大元素
/*堆排序
*/
class Solution {
public:
//i:从0开始,标号值要加1
void maxHeapify(vector<int>& a,int i,int heapsize){
//l:右子节点,r:l的右边的一个节点
int l = i*2 + 1,r = i*2 + 2,largest = i;
//找最大
if(l<heapsize&&a[l]>a[largest]){
largest = l;
}
if(r<heapsize&&a[r]>a[largest]){
largest = r;
}
if(largest!=i){
swap(a[i],a[largest]);//往下调整
maxHeapify(a,largest,heapsize);
}
}
void buildMaxHeap(vector<int>& a,int heapsize){
for(int i = heapsize/2;i>=0;--i){//调整堆
maxHeapify(a,i,heapsize);
}
}
int findKthLargest(vector<int>& nums, int k) {
int heapsize = nums.size();
buildMaxHeap(nums,heapsize);
for(int i = nums.size()-1;i>=nums.size()-k+1;--i){
swap(nums[0],nums[i]);
--heapsize;
maxHeapify(nums,0,heapsize);
}
return nums[0];
}
};
//https://leetcode-cn.com/problems/kth-largest-element-in-an-array/solution/shu-zu-zhong-de-di-kge-zui-da-yuan-su-by-leetcode-/
在建立二维前缀数组之后, 就可以找第k大的数值了。
class Solution {
public:
int kthLargestValue(vector<vector<int>>& matrix, int k) {
int m = matrix.size(), n = matrix[0].size();
vector<vector<int>> pre(m + 1, vector<int>(n + 1));
vector<int> results;
for (int i = 1; i <= m; ++i) {
for (int j = 1; j <= n; ++j) {
pre[i][j] = pre[i - 1][j] ^ pre[i][j - 1] ^ pre[i - 1][j - 1] ^ matrix[i - 1][j - 1];
results.push_back(pre[i][j]);
}
}
sort(results.begin(), results.end(), greater<int>());
return results[k - 1];
}
};
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/find-kth-largest-xor-coordinate-value/solution/zhao-chu-di-k-da-de-yi-huo-zuo-biao-zhi-mgick/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。