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)).
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
寻找2个有序表的中位数,直接递归搞。
class Solution(object):
def findKth(self, a, n, b, m, k):
if n > m:
return self.findKth(b, m, a, n, k)
if n == 0:
return b[k - 1]
if k == 1:
return min(a[0], b[0])
pa = min(int(k / 2), n)
pb = k - pa
if a[pa-1] < b[pb-1]:
return self.findKth(a[pa:], n - pa, b, m, k - pa)
elif a[pa-1] > b[pb-1]:
return self.findKth(a, n, b[pb:], m - pb, k - pb)
return a[pa-1]
def findMedianSortedArrays(self, nums1, nums2):
n = len(nums1)
m = len(nums2)
d = n + m
if d % 2 == 1:
return 1.0 * self.findKth(nums1, n, nums2, m, int(d / 2) + 1)
else:
return 0.5 * (self.findKth(nums1, n, nums2, m, int(d / 2) + 1)
+ self.findKth(nums1, n, nums2, m, int(d / 2) ))
if __name__ == '__main__':
s = Solution()
print(s.findMedianSortedArrays([1,3] , [2]))
print(s.findMedianSortedArrays([1,2], [3,4]))
import java.util.* ;
public class Solution{
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int n = nums1.length ;
int m = nums2.length ;
int d = n + m ;
if((d & 1) == 1) return 1.0 * findKth(nums1, n, nums2, m, d/2 + 1) ;
else return 0.5 * (findKth(nums1, n, nums2 , m, d/2)
+ findKth(nums1, n, nums2, m, d/2+1) ) ;
}
public int findKth(int[] a, int n , int[] b , int m , int k){
if(n > m) // ensure n <= m
return findKth(b, m, a, n, k) ;
if(n == 0) return b[k-1] ;
if(k == 1) return Math.min(a[0], b[0]) ;
int pa = Math.min(k/2 , n) ;
int pb = k - pa ;
if(a[pa-1] < b[pb-1])
return findKth(Arrays.copyOfRange(a, pa , n) , n-pa , b, m, k-pa) ;
else if(a[pa-1] > b[pb-1])
return findKth(a, n, Arrays.copyOfRange(b, pb, m) , m - pb , k - pb) ;
return a[pa-1] ;
}
public static void main(String[] args) {
System.out.println(new Solution().findMedianSortedArrays(new int[]{1,2,3}, new int[]{6,7})) ;
}
}