- 题目描述:寻找两个有序数组的中位数
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。
请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。
你可以假设 nums1 和 nums2 不会同时为空。
示例 1:
nums1 = [1, 3]
nums2 = [2]
则中位数是 2.0
示例 2:
nums1 = [1, 2]
nums2 = [3, 4]
则中位数是 (2 + 3)/2 = 2.5
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
- Python编程实现:
def median(A, B):
m,n = len(A), len(B)
if m > n:
A, B, m, n = B, A, n, m
if n == 0:
raise ValueError
if m == 0:
if n % 2 == 1:
return B[int(n/2)]
else:
return (B[n/2-1]+B[n/2]) / 2.0
imin, imax, half_len = 0, m, (m+n+1)/2
while imin <= imax:
i = int((imin + imax) / 2)
j = int(half_len - i)
if i < m and B[j-1] > A[i] and j > 0:
# i is too small, must increase it
imin = i+1
elif j < n and A[i-1] > B[j] and i > 0:
# i is too big, must decrease it
imax = i-1
else:
# i is perfect
if i == 0: max_of_left = B[j-1]
elif j == 0: max_of_left = A[i-1]
else: max_of_left = max(A[i-1], B[j-1])
if (m+n) % 2 == 1:
return max_of_left
if i == m: min_of_right = B[j]
elif j == n: min_of_right = A[i]
else: min_of_right = min(A[i], B[j])
return (max_of_left + min_of_right) / 2.0
- C++编程实现:
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2)
{
if (nums1.size() > nums2.size())
{
return findMedianSortedArrays(nums2, nums1);
}
int N = nums1.size();
int M = nums2.size();
int half = (N + M) / 2;
int low = 0;
int high = N;
while (low <= high)
{
int mid = low + (high - low) / 2;
int t = half - mid;
int lmax1 = (mid - 1 >= 0) ? nums1[mid - 1] : INT_MIN;
int rmin1 = (mid < N) ? nums1[mid] : INT_MAX;
int lmax2 = (t - 1 >= 0) ? nums2[t - 1] : INT_MIN;
int rmin2 = (t < M) ? nums2[t] : INT_MAX;
if (lmax1 > rmin2)
high = mid - 1;
else if (lmax2 > rmin1)
low = mid + 1;
else
{
low = high = mid;
break;
}
}
int u = low;
int v = half - low;
int l = max( u - 1 >= 0 ? nums1[u - 1] : INT_MIN, v - 1 >= 0 ? nums2[v - 1] : INT_MIN);
int r = min( u < N ? nums1[u] : INT_MAX, v < M ? nums2[v] : INT_MAX);
if ((N + M) % 2 == 1)
return r;
return (l + r) * 1.0 / 2;
}
};
//作者:da-li-wang
//链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays/solution/c-er-fen-cha-zhao-by-da-li-wang/
//来源:力扣(LeetCode)
//著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。