LeetCode 算法学习(3)

题目描述

Median of Two Sorted Arrays
There are two sorted arrays nums1 and nums2 of size m and n respectively.
Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).
You may assume nums1 and nums2 cannot be both empty.

Example 1:
nums1 = [1, 3]
nums2 = [2]

The median is 2.0

Example 2:
nums1 = [1, 2]
nums2 = [3, 4]

The median is (2 + 3)/2 = 2.5

题目大意

给出两个排好序的数组,找出它们的中值。

思路分析

这是一道经典的分而治之的题目,将两个有序数组分成两半,找出数值小的部分的最大值和数值大的部分的最小值,中值就等于他们的平均数((m+n)为偶数时),或者其中之一((m+n)为奇数)。时间复杂度为O(log n),空间复杂度为O(1)。

关键代码

    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        int m = nums1.size();
        int n = nums2.size();
        if (m < n) { // ensure that m >= n
            vector<int> temp = nums1;
            nums1 = nums2;
            nums2 = temp;
            m = nums1.size();
            n = nums2.size();
        }
        int low = 0, high = n, half = (m+n+1)/2;
        while (low <= high) { // divide in two part
            int med1 = (low+high)/2;
            int med2 = half-med1;
            if (med1 < high && nums1[med2-1] > nums2[med1]) { // median in the right part
                low = med1 + 1;
            } else if (med1 > low && nums2[med1-1] > nums1[med2]) { // median in the left part
                high = med1 - 1;
            } else {
                // max of left part
                int maxLeft = 0;
                if (med1 == 0) maxLeft = nums1[med2-1];
                else if (med2 == 0) maxLeft = nums2[med1-1];
                else maxLeft = (nums2[med1-1] > nums1[med2-1]) ? nums2[med1-1] : nums1[med2-1];
                if ((m+n)%2 == 1) return maxLeft;

                // min of the right part
                int minRight = 0;
                if (med1 == n) minRight = nums1[med2];
                else if (med2 == m) minRight = nums2[med1];
                else minRight = (nums1[med2] > nums2[med1]) ? nums2[med1] : nums1[med2];

                return (maxLeft + minRight)/2.0;
            }
        }
        return 0;
    }

总结

这道题给我们提供了分而治之的思想,在查找两部分的最大(小)值时采用二分法,加快了算法的速度。而在处理m+n为奇偶数的时候需要小心。
采用合并再查找也可以,时间复杂度变为O(m+n),但是这就没有用到分而治之的思想了。

猜你喜欢

转载自blog.csdn.net/L_Realoo/article/details/85263969
今日推荐