【LeetCode 4. Median of Two Sorted Arrays】两个有序数组的中位数求解

本文介绍了一种高效算法,用于找出两个已排序数组合并后的中位数,时间复杂度为O(log(m+n))。通过类似归并排序的方法,仅需遍历一次即可找到中位数。

一、题目描述

给定两个已经排好序的数组nums1和nums2,长度分别是m和n,要求求出这两个有序数组合并后的新数组中的中位数,并要求整个程序实现的时间复杂度为O(log(m+n))。例如数组1 nums1=[1,3],给定的数组2为 nums2=[2],则输出数组[1,2,3]的中位数2.0,若是[1,2]和[3,4],则输出中位数2.5。

二、思路解析

这道题的难点在于控制时间复杂度,由于要求的时间复杂度为O(m+n),因此只能遍历两个数组一遍。本人采取的做法是归并排序中的思想,即在两个数组中的头部设置一个指针a,b,以及新建一个新数组temp,temp用于存储两数组合并后的新数组值。每次比较指针a和b的值,若a比b小,则将a指针的值存进temp数组,a指针往前一位,计数k加1,反之亦然。k的值也即为temp数组中所保存的元素的数量,当k等于两数组长度和的一半时,此时进行判断,若m+n为奇数,则输出temp[k],否则输出(temp[k]+temp[k-1])/2。可以说,在理解了归并排序的思想后去解决此题,可以有效的得到答案。

三、代码实现

class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        double out;
        int i = 0, j = 0;
        int length;
        vector<double> temp(1000);
        length = nums1.size() + nums2.size();
         int mid = (nums1.size() + nums2.size()) / 2;
        int flag = (nums1.size() + nums2.size()) % 2;
        if(nums2.size() == 0 && (nums1.size() % 2) == 0) {
            temp[0] = nums1[mid];
            temp[1] = nums1[mid - 1];
            out = (temp[0] + temp[1]) / 2;
            return out;
        } else if(nums2.size() == 0 && (nums1.size() % 2) == 1) {
            return nums1[mid];
        }
        if(nums1.size() == 0 && (nums2.size() % 2) == 0) {
            temp[0] = nums2[mid];
            temp[1] = nums2[mid - 1];
            out = (temp[0] + temp[1]) / 2;
            return out;
        } else if(nums1.size() == 0 && (nums2.size() % 2) == 1) {
            return nums2[mid];
        }
       for(int k = 0; k < length; k++) {
           if(nums1[i] <= nums2[j] && i < nums1.size()) {
               temp[k] = nums1[i];
               i++;
           } else if(nums2[j] <= nums1[i] && j < nums2.size()) {
               temp[k] = nums2[j];
               j++;
           } else if(j >= nums2.size()){
               temp[k] = nums1[i];
               i++;
           } else if(i >= nums1.size()){
               temp[k] = nums2[j];
               j++;
           }
           if((flag == 1) && (k == mid)) {
               out = temp[k];
               break;
           } else if((flag == 0) && (k == mid)) {
               out = (temp[k] + temp[k - 1]) / 2;
               break;
           }
       }
       return out;
    }
};

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值