LeetCode 4. Median of Two Sorted Arrays
题目要求O(log(m+n)),很自然想到二分。但是怎么二分缩小搜索区域比较tricky。找中位数,可以看成找第k个数的问题,比较两个数组第k/2个元素(奇数偶数都可),小的那个数组的前面元素都可以丢掉(不可能是第k大的元素)。
本题的corner case比较多,如k==1,len=0。而且有奇数偶数的情况,需要注意。
详见 http://windliang.cc/2018/07/18/leetCode-4-Median-of-Two-Sorted-Arrays/
class Solution { public: double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) { int n = nums1.size(); int m = nums2.size(); int left = (n + m + 1) / 2; int right = (n + m + 2) / 2; return (getkth(nums1, 0, n - 1, nums2, 0, m - 1, left) + getkth(nums1, 0, n - 1, nums2, 0, m - 1, right)) * 0.5; } int getkth(vector<int> &nums1, int start1, int end1, vector<int> &nums2, int start2, int end2, int k){ int len1=end1-start1+1, len2=end2-start2+1; if (len1>len2) return getkth(nums2,start2,end2,nums1,start1,end1,k); if (len1==0) return nums2[start2+k-1]; if (k==1) return min(nums1[start1],nums2[start2]); int i=start1+min(len1,k/2)-1; int j=start2+min(len2,k/2)-1; if (nums1[i]>nums2[j]) return getkth(nums1,start1,end1,nums2,j+1,end2,k-(j-start2+1)); else return getkth(nums1,i+1,end1,nums2,start2,end2,k-(i-start1+1)); } };

浙公网安备 33010602011771号