力扣 leetcode 4. 寻找两个正序数组的中位数

问题描述

给定两个大小分别为 mn 的正序(从小到大)数组 nums1nums2。请你找出并返回这两个正序数组的 中位数

算法的时间复杂度应该为 O(log (m+n))

提示:

  • nums1.length == m
  • nums2.length == n
  • 0 <= m <= 1000
  • 0 <= n <= 1000
  • 1 <= m + n <= 2000
  • -10^6 <= nums1[i], nums2[i] <= 10^6

示例

示例 1:

输入:nums1 = [1,3], nums2 = [2]
输出:2.00000
解释:合并数组 = [1,2,3] ,中位数 2

示例 2:

输入:nums1 = [1,2], nums2 = [3,4]
输出:2.50000
解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5

解题思路

本题比较简单,因为给出的两个数组都是有序的,因此,只需记录nums1nums2中各个元素分别在合并后数组的位置,即可找出中位数。

其中一种方法是将nums1nums2放入一个新的数组,使新的数组满足正序,就可以很快找出其中的中位数。

class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        int i = 0;
        int j = 0;
        vector<int> num((nums1.size() + nums2.size()) / 2 + 1);
        for(int k = 0; k < num.size(); k++){
            if(i < nums1.size()){
                if(j < nums2.size()){
                    num[k] = nums1[i] < nums2[j] ? nums1[i++] : nums2[j++];
                }
                else{
                    num[k] = nums1[i++];
                }
            }
            else{
                num[k] = nums2[j++];
            }
        }
        for(int i = 0; i < num.size(); i++){
            cout << num[i] << ' ';
        }
        if((nums1.size() + nums2.size()) % 2){
            return static_cast<double> (num[num.size() - 1]);
        }
        return (num[num.size() - 1] + num[num.size() - 2]) / 2.0;
    }
};

另一种方法是不保存新的数组,但是记录现在总共遍历了k个元素,如果k == (nums1.size() + nums2.size()) / 2,则可以k就是中位数的点。注意,这里考虑的是总长度为奇数时的情况,偶数也是一样的。

class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        int i = 0;
        int j = 0;
        int k = -1;
        int half;
        double result;
        if((nums1.size() + nums2.size()) % 2){ // 奇数情况
            half = (nums1.size() + nums2.size()) / 2;
            while(1){
                if(i < nums1.size()){
                    if(j < nums2.size()){
                        if(nums1[i] < nums2[j]){
                            if(++k == half){
                                return static_cast<double>(nums1[i]);
                            }
                            i++;
                        }
                        else{
                            if(++k == half){
                                return static_cast<double>(nums2[j]);
                            }
                            j++;
                        }
                    }
                    else{
                        if(++k == half){
                            return static_cast<double>(nums1[i]);
                        }
                        i++;
                    }
                }
                else{
                    if(++k == half){
                        return static_cast<double>(nums2[j]);
                    }
                    j++;
                }
            }
        }
        else{ // 偶数情况
            half = (nums1.size() + nums2.size()) / 2;
            while(1){
                if(i < nums1.size()){
                    if(j < nums2.size()){
                        if(nums1[i] < nums2[j]){
                            if(++k == half){
                                return (nums1[i] + result) / 2.0;
                            }
                            else if(k == half - 1){
                                result = nums1[i];
                            }
                            i++;
                        }
                        else{
                            if(++k == half){
                                return (nums2[j] + result) / 2.0;
                            }
                            else if(k == half - 1){
                                result = nums2[j];
                            }
                            j++;
                        }
                    }
                    else{
                        if(++k == half){
                            return (nums1[i] + result) / 2.0;
                        }
                        else if(k == half - 1){
                            result = nums1[i];
                        }
                        i++;
                    }
                }
                else{
                    if(++k == half){
                        return (nums2[j] + result) / 2.0;
                    }
                    else if(k == half - 1){
                        result = nums2[j];
                    }
                    j++;
                }
            }
        }
        return result;
    }
};
posted @ 2022-11-27 14:59  greatestchen  阅读(11)  评论(0编辑  收藏  举报