LeetCode Median of Two Sorted Arrays

来源:互联网 发布:groovy编程 编辑:程序博客网 时间:2024/06/07 17:34

Description:

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)).

Solution:

这道题目是我目前在LeetCode上面debug最多的一道了……二分区间对于边界的掌握条件一定要很清楚,加一减一很复杂。下面讲一下思路。

nums1 = [s1 ... mid1-1], [mid1 ... e1] = {seg1, seg2}

nums2 = [s2 ... mid2-1], [mid2 ... e2] = {seg3, seg4}

每次可以这么判断:

如果两个array的前半段的长度 之和 >k, 那么k肯定不会在 nums1的后半段或者nums2的后半段,下面就判断哪一个不可能。len(seg1+seg3) < k。

如果nums1[mid1]大于nums2[mid],那么大小可以认为是这样: 

seg3 < nums1[mid1] <= seg2

此时我们有

seg1 < seg2

seg3 < seg2

seg1 + seg3 < k

因为并不知道seg1和seg4的关系,但是无论如何,我们都能得出结论:此时第k大肯定不在seg2中,因此排除seg2。

后面的三种情况类似。

对于二分查找区间的问题,stopping criteria和bound都需要特别注意。


<span style="font-size:18px;">public class Solution {public int findKthSmaller(int[] nums1, int[] nums2, int s1, int e1, int s2,int e2, int k) {if (s1 >= e1)return nums2[s2 + k - 1];if (s2 >= e2)return nums1[s1 + k - 1];if (k <= 1)return Math.min(nums1[s1], nums2[s2]);int mid1 = (s1 + e1) / 2;int mid2 = (s2 + e2) / 2;if (mid1 - s1 + mid2 - s2 + 1 < k) {if (nums1[mid1] > nums2[mid2])return findKthSmaller(nums1, nums2, s1, e1, mid2 + 1, e2, k- (mid2 - s2 + 1));elsereturn findKthSmaller(nums1, nums2, mid1 + 1, e1, s2, e2, k- (mid1 - s1 + 1));} else {if (nums1[mid1] > nums2[mid2])return findKthSmaller(nums1, nums2, s1, mid1, s2, e2, k);elsereturn findKthSmaller(nums1, nums2, s1, e1, s2, mid2, k);}}public double findMedianSortedArrays(int[] nums1, int[] nums2) {int n = nums1.length;int m = nums2.length;if ((n + m) % 2 != 0)return findKthSmaller(nums1, nums2, 0, n, 0, m, (n + m) / 2 + 1);int k1 = (n + m) / 2;int k2 = (n + m) / 2 + 1;k1 = findKthSmaller(nums1, nums2, 0, n, 0, m, k1);System.out.println();k2 = findKthSmaller(nums1, nums2, 0, n, 0, m, k2);System.out.println();return 1.0 * (k1 + k2) / 2;}}</span>


0 0
原创粉丝点击