美文网首页
4. 两个排序数组的中位数

4. 两个排序数组的中位数

作者: coconutyao | 来源:发表于2018-08-26 17:25 被阅读0次

    https://leetcode-cn.com/problems/median-of-two-sorted-arrays/description/
    给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 。
    请找出这两个有序数组的中位数。要求算法的时间复杂度为 O(log (m+n)) 。
    你可以假设 nums1 和 nums2 不同时为空。

    Examples:
    给定两个大小为 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

    思路

    这里用的是双指针归并的方式,寻找第k大的数,时间复杂度为O(m + n)
    还有一种效率更高的方式,类似二分查找,时间复杂度为O(log(m + n)),后续补上。


    class Solution {
    public:
        double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
            int need_next = 1 - (nums1.size() + nums2.size()) % 2;
            size_t k = (nums1.size() + nums2.size()) / 2 - need_next;
    
            return find_kth(nums1, nums2, k, need_next);
        }
    
        double find_kth(vector<int>& nums1, vector<int>& nums2, size_t k, int need_next) {
            if (nums1.size() == 0 && nums2.size() == 0) {
                return 0;
            }
    
            if (nums1.size() == 0 && nums2.size() != 0) {
                if (need_next) {
                    return ((double)nums2[k] + need_next * nums2[k + 1]) / 2;
                }
                return nums2[k];
            }
    
            if (nums1.size() != 0 && nums2.size() == 0) {
                if (need_next) {
                    return ((double)nums1[k] + need_next * nums1[k + 1]) / 2;
                }
                return nums1[k];
            }
    
            double target = 0;
            size_t k1 = 0;
            size_t k2 = 0;
            while (k1 + k2 < k + 1) {
                if (k1 < nums1.size() && k2 < nums2.size()) {
                    if (nums1[k1] <= nums2[k2]) {
                        target = nums1[k1++];
                    } else {
                        target = nums2[k2++];
                    }
                } else {
                    if (k1 >= nums1.size()) {
                        target = nums2[k2++];
                    } else {
                        target = nums1[k1++];
                    }
                }
    
            }
    
            if (need_next) {
                if (k1 < nums1.size() && k2 < nums2.size()) {
                    if (nums1[k1] <= nums2[k2]) {
                        target = (target + nums1[k1]) / 2;
                    } else {
                        target = (target + nums2[k2]) / 2;
                    }
                } else {
                    if (k2 >= nums2.size()) {
                        target = (target + nums1[k1]) / 2;
                    } else {
                        target = (target + nums2[k2]) / 2;
                    }
                }
            }
    
            return target;
    
        }
    };
    

    相关文章

      网友评论

          本文标题:4. 两个排序数组的中位数

          本文链接:https://www.haomeiwen.com/subject/jhioiftx.html