leecode第四题(寻找两个有序数组的中位数)

leecode第四题(寻找两个有序数组的中位数)

 题解:

leecode第四题(寻找两个有序数组的中位数)

leecode第四题(寻找两个有序数组的中位数)

leecode第四题(寻找两个有序数组的中位数)

leecode第四题(寻找两个有序数组的中位数)

leecode第四题(寻找两个有序数组的中位数)

 

class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        int m = nums1.size();
        int n = nums2.size();
        if (m > n) return findMedianSortedArrays(nums2, nums1);//保证nums1个数少于nums2
        int iMin = 0, iMax = m, halfLen = (m + n + 1) / 2;
        while (iMin <= iMax) {
            int i = (iMin + iMax) / 2;
            int j = halfLen - i;//保证左右部分数目一样多
            if (i < iMax && nums2[j - 1] > nums1[i]) {
                iMin = i + 1; // i is too small
            }
            else if (i > iMin && nums1[i - 1] > nums2[j]) {
                iMax = i - 1; // i is too big
            }
            else { // i is perfect,这里满足左部分最大点小于等于右部分最小点
                int maxLeft = 0;
                if (i == 0) { maxLeft = nums2[j - 1]; }
                else if (j == 0) { maxLeft = nums1[i - 1]; }
                else { maxLeft = max(nums1[i - 1], nums2[j - 1]); }//这些都是极值情况,放在最后输出处理即可
                if ((m + n) % 2 == 1) { return maxLeft; }

                int minRight = 0;
                if (i == m) { minRight = nums2[j]; }
                else if (j == n) { minRight = nums1[i]; }
                else { minRight = min(nums2[j], nums1[i]); }

                return (maxLeft + minRight) / 2.0;//偶数个的中位数
            }
        }
        return 0.0;
    }
};

 

 

总结:

我很惭愧,这个题写了三个多小时都没做出来,我一开始看到时间复杂度,想到二分法,然后不停判断并删除两个数组中大于中位数的值,然后稳定条件是两个数组剩余个数是m+n的一半,程序就是有问题。。。

总得来说还是没有洞悉最有价值的规律,分析情况又把我绕迷糊了,唉,学习到了。

 

上一篇:leecode第十五题(三数之和)


下一篇:Leecode刷题之旅-C语言/python-387 字符串中的第一个唯一字符