leetcode-寻找两个正序数组的中位数
\
此题与之前在一个数组中找中位数类似,可以在基础上修改。
不过在入堆的时候需要对两个数组大小元素进行判断,小的入堆。
class Solution { public: double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) { priority_queue<int, vector<int>, greater<int> > minheap; priority_queue<int, vector<int>, less<int> > maxheap; int i = 0; int j = 0; while(i<nums1.size()&&j<nums2.size()){ if(minheap.size()==maxheap.size()){ if(nums1[i]<=nums2[j]){ cout<<"nums1_"<<i<<"_:"<<nums1[i]<<endl; maxheap.push(nums1[i]); int tmp = maxheap.top(); maxheap.pop(); minheap.push(tmp); i++; }else{ cout<<"nums2_"<<j<<"_:"<<nums2[j]<<endl; maxheap.push(nums2[j]); int tmp = maxheap.top(); maxheap.pop(); minheap.push(tmp); j++; } }else { if(nums1[i]<=nums2[j]){ cout<<"nums11_"<<i<<"_:"<<nums1[i]<<endl; minheap.push(nums1[i]); int tmp = minheap.top(); minheap.pop(); maxheap.push(tmp); i++; }else{ cout<<"nums22_"<<j<<"_:"<<nums2[j]<<endl; minheap.push(nums2[j]); int tmp = minheap.top(); minheap.pop(); maxheap.push(tmp); j++; } } } while(i<nums1.size()&&j>=nums2.size()){ if(minheap.size()==maxheap.size()){ maxheap.push(nums1[i]); int tmp = maxheap.top(); maxheap.pop(); minheap.push(tmp); cout<<"nums1_"<<i<<"_:"<<nums1[i]<<endl; i++; }else{ minheap.push(nums1[i]); int tmp = minheap.top(); minheap.pop(); maxheap.push(tmp); cout<<"nums1_"<<i<<"_:"<<nums1[i]<<endl; i++; } } while(j<nums2.size()&&i>=nums1.size()){ if(minheap.size()==maxheap.size()){ maxheap.push(nums2[j]); int tmp = maxheap.top(); maxheap.pop(); minheap.push(tmp); cout<<"nums2_"<<j<<"_:"<<nums2[j]<<endl; j++; }else{ minheap.push(nums2[j]); int tmp = minheap.top(); minheap.pop(); maxheap.push(tmp); cout<<"nums2_"<<j<<"_:"<<nums2[j]<<endl; j++; } } cout<<"top:"<<maxheap.top()<<"_:"<<minheap.top()<<endl; if(maxheap.size()==minheap.size()) return (double(maxheap.top())+double(minheap.top()))/2; else return minheap.top(); } };
简介版:
/* 比如num1: [1,3,5] nums2: [2, 4, 6] k = (num1.size()+num2.size())/2+1 = 4 先建立一个size为k的大根堆,随后对两个数组中元素判断, 先直接将元素入堆,如果当前堆的size大于KK,再弹出一个元素,保证堆中一直是遍历过的k个最小元素。 如果两个数组的和为偶数:最后从堆中弹出两个元素求和 如果两个数组的和为奇数:最后从堆中弹出一个元素 */ class Solution { public: double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) { priority_queue<int, vector<int>, less<int>> maxheap; int k = 0; k = (nums1.size()+nums2.size())/2+1; // 构建堆的初始大小 for(int i = 0; i<nums1.size(); i++){ maxheap.push(nums1[i]); if(maxheap.size()>k) maxheap.pop(); } for(int i = 0; i<nums2.size(); i++){ maxheap.push(nums2[i]); if(maxheap.size()>k) maxheap.pop(); } double res = 0; if((nums1.size()+nums2.size())%2==0){ double temp1 = maxheap.top(); maxheap.pop(); double temp2 = maxheap.top(); return (temp1+temp2)/2; } else return maxheap.top(); } };