class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums1 int整型vector * @param nums2 int整型vector * @return double浮点型 */ double Median(vector<int>& nums1, vector<int>& nums2) { // write code here // 前面做过在两个长度相等的排序数组中找到上中位数,和这道题是类似的 // 现在这道题和之前不一样的点在于两个数组长度不一样,然后必须找中位数 // 长度不一样好解决,还是先计算中位数排多少位,设置 cut1 和 cut2,二分去找就行 // 现在要找中位数,这里就要分一下总共元素个数的奇偶,偶数的话找上中位数和下中位数,再平均即可 if (nums1.size() > nums2.size()) { swap(nums1, nums2); } // 注意这里把较短的数组放前面,且设短数组长度为 m,长数组长度为 n int m = nums1.size(); int n = nums2.size(); int totalLeft = (m + n + 1) / 2; // 多加 1 保证总数为奇数个时取到中间 int left = 0; int right = m; while (left < right) { int i = left + (right - left + 1) / 2; int j = totalLeft - i; if (nums1[i - 1] > nums2[j]) { right = i - 1; } else { left = i; } } int i = left; int j = totalLeft - i; int nums1LeftMax = i == 0 ? INT_MIN : nums1[i - 1]; int nums2LeftMax = j == 0 ? INT_MIN : nums2[j - 1]; int nums1RightMin = i == m ? INT_MAX : nums1[i]; int nums2RightMin = j == n ? INT_MAX : nums2[j]; if ((m + n) % 2 == 1) { return max(nums1LeftMax, nums2LeftMax); } else { return (max(nums1LeftMax, nums2LeftMax) + min(nums1RightMin, nums2RightMin)) / 2.0; } } };
这道题最抽象的地方在于 C++ 是通过不了自测样例的,和函数返回值类型有关,而 C++ 里返回的 double 类型的结果会有一堆 0 放在最后,比如题目期望的是 3.5,我们的代码返回的结果是 3.5000 这样的情况。