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

一、题目描述

给定两个已经排好序的数组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& nums1, vector& nums2) {
        double out;
        int i = 0, j = 0;
        int length;
        vector 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;
    }
};

你可能感兴趣的:(算法)