【leetcode】4. Median of Two Sorted Arrays
阿新 • • 發佈:2019-01-11
4. Median of Two Sorted Arrays
Problem
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)).
You may assume nums1 and nums2 cannot be both empty.
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
Solution
1、python (108ms)
class Solution(object):
def findKth(self, nums1, nums2, k):
len1 = len(nums1)
len2 = len(nums2)
if len2 < len1: # promise len1 < len2
return self.findKth(nums2, nums1, k)
if len1 == 0:
return nums2[k - 1]
if k == 1: # output
return min([nums1[0], nums2[0]])
p1 = min(k/2, len1)
p2 = k - p1
if nums1[p1 - 1] <= nums2[p2 - 1]:
return self.findKth(nums1[p1:], nums2, p2) # desert before p1 in num1
else:
return self.findKth(nums1, nums2[p2:], p1)
def findMedianSortedArrays(self, nums1, nums2):
"""
:type nums1: List[int]
:type nums2: List[int]
:rtype: float
"""
lennums1 = len(nums1)
lennums2 = len(nums2)
if (lennums1 + lennums2) % 2 == 1:
return self.findKth(nums1, nums2, (lennums1 + lennums2)/2 + 1)
else:
return (self.findKth(nums1, nums2, (lennums1 + lennums2)/2) + self.findKth(nums1, nums2, (lennums1 + lennums2)/2 + 1))/2.0
2、C (36ms)
int findKth(int *nums1, int num1, int *nums2, int num2, int k) {
if (num1 > num2) {
return findKth(nums2, num2, nums1, num1, k);
}
if (num1 == 0) {
return *(nums2 + k -1);
}
if (k == 1) {
return *nums1 <= *nums2 ? *nums1 : *nums2;
}
int p1 = k/2 <= num1 ? k/2 : num1;
int p2 = k - p1;
if (*(nums1 + p1 - 1) <= *(nums2 + p2 - 1)) {
return findKth(nums1 + p1, num1 - p1, nums2, num2, p2);
} else {
return findKth(nums1, num1, nums2 + p2, num2 - p2, p1);
}
}
double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size) {
if ((nums1Size + nums2Size) % 2 == 1) {
return findKth(nums1, nums1Size, nums2, nums2Size, (nums1Size + nums2Size)/2 + 1);
} else {
return (findKth(nums1, nums1Size, nums2, nums2Size, (nums1Size + nums2Size)/2) + findKth(nums1, nums1Size, nums2, nums2Size, (nums1Size + nums2Size)/2 + 1)) / 2.0;
}
}