Leetcode之 寻找两个有序数组的中位数

题目描述

给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。

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

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

思路

  1. 双指针,一个指向nums1,一个指向nums2,若nums1小或者nums2的指针到末尾了,则压入nums1,否则压入nums2。时间复杂度O(m+n)
  2. 要想达到log(m+n),则需要采用二分法,解析如

代码

class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        int len1 = nums1.size();
        int len2 = nums2.size();
        int len = len1 + len2;
        vector<int> res;
        if (len % 2 == 0) /*判断长度为偶数还是奇数*/
        {
            int i_nums1 = 0, i_nums2 = 0; /*双指针*/
            while (i_nums1 + i_nums2 <= len / 2) /*判断是否到达中位数*/
            {
                if (i_nums2 == len2  || (i_nums1 < len1 && nums1[i_nums1] <= nums2[i_nums2]) )/*需要先判断i_nums2 是否到末尾,否则会报错,同时要取<=*/
                {
                    res.push_back(nums1[i_nums1]);
                    i_nums1++;
                }
                else if (i_nums1 == len1 || (i_nums2 < len2  && nums2[i_nums2] < nums1[i_nums1]) )
                {
                    res.push_back(nums2[i_nums2]);
                    i_nums2++;
                }
            }
            return (res[res.size() - 1] + res[res.size() - 2]) / 2.0;
        }
        else
        {
            int i_nums1 = 0, i_nums2 = 0;
            while (i_nums1 + i_nums2 <= (len - 1) / 2)
            {
                if (i_nums2 == len2 || (i_nums1 < len1 && nums1[i_nums1] <= nums2[i_nums2]))
                {
                    res.push_back(nums1[i_nums1]);
                    i_nums1++;
                }
                else if (i_nums1 == len1 || (i_nums2 < len2  && nums2[i_nums2] < nums1[i_nums1]))
                {
                    res.push_back(nums2[i_nums2]);
                    i_nums2++;
                    
                }
            }
            return res[res.size() - 1] * 1.0;
        }
        return 0.0;
    }
};
发布了85 篇原创文章 · 获赞 0 · 访问量 380

猜你喜欢

转载自blog.csdn.net/weixin_38312163/article/details/105003107