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();

    }
};

 

posted @ 2021-07-14 15:28  三一一一317  阅读(44)  评论(0)    收藏  举报