4. 寻找两个正序数组的中位数:暴力解法(不满足log(m+n)) +二分查找解法(在研究)+划分数组(在研究)

4 篇文章 0 订阅
1 篇文章 0 订阅

给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。

请你找出这两个正序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。

你可以假设 nums1 和 nums2 不会同时为空。

示例 1:

nums1 = [1, 3]
nums2 = [2]

则中位数是 2.0
示例 2:

nums1 = [1, 2]
nums2 = [3, 4]

则中位数是 (2 + 3)/2 = 2.5

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

暴力解法,不满足题设条件。不推荐

在这里插入图片描述

使用map,存储nums1和nums2中所有数字。 k为数字 v为次数
然后看总长度为奇数还是偶数。
若是奇数,寻找长度%2+1的位置,循环遍历map中的v,直到找到中位数位置即退出。
偶数类似。

本题主要利用了map自动排序的特效。

class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        int count=nums1.size()+nums2.size();
        double ans=0,middleNum=0;
        map<int,int> m;
        for(int i=0;i<nums1.size();i++)
            m[nums1[i]]++;
        for(int i=0;i<nums2.size();i++)
            m[nums2[i]]++;


        map<int,int>::iterator it;

        int i=0;

        if(count%2==0)
        {
            middleNum=count/2;
            cout<<"middleNum"<<middleNum<<endl;
            for(it=m.begin();it!=m.end();it++)
            {
                int k=0;
                for(int j=1;j<=it->second;j++)
                {
                    ++i;
                    cout<<"i "<<i<<endl;
                    if(i==middleNum||i==(middleNum+1))
                    {
                        ans+=it->first;
                        k++;
                    }
                }
                if(k==2)
                    break;
            }
        }else
        {
            middleNum=count/2+1;
            
            for(it=m.begin();it!=m.end();it++)
            {
                for(int j=1;j<=it->second;j++)
                {
                    ++i;
                    if(i==middleNum)
                    {
                        return it->first;
                    }
                }  
            }
        }

        return ans/2;
    }
};

二分查找

划分数组

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值