解法一:(双指针)用双指针顺序逐步加入新的数组,时间复杂度O(m+n),空间复杂度O(m+n)
解法二:(二分查找)找这两个数组的分割线,保证:分割线的左边个数=分割线的右边个数or分割线的左边个数+1=分割线的右边个数。于是中位数应该为:偶数情况,(左边最大值+右边最小值)/2;奇数情况,分割线左边最大数。

class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
if (nums1.length > nums2.length) {
int[] temp = nums1;
nums1 = nums2;
nums2 = temp;
}
int m = nums1.length;
int n = nums2.length;
int totalLeft = (m + n + 1) / 2;
int left = 0, right = m;
while (left < right) {
int i = (left + right) / 2;
int j = totalLeft - i;
if (nums2[j - 1] > nums1[i]) {
left = i + 1;
} else {
right = i;
}
}
int i = left;
int j = totalLeft - i;
int nums1LeftMax = i == 0 ? Integer.MIN_VALUE : nums1[i - 1];
int nums2LeftMax = j == 0 ? Integer.MIN_VALUE : nums2[j - 1];
int nums1RightMin = i == m ? Integer.MAX_VALUE : nums1[i];
int nums2RightMin = j == n ? Integer.MAX_VALUE : nums2[j];
if ((m + n) % 2 == 1) {
return Math.max(nums1LeftMax, nums2LeftMax);
} else {
return (double) (Math.max(nums1LeftMax, nums2LeftMax) + Math.min(nums1RightMin, nums2RightMin))/ 2;
}
}
}
注意:
int left = 0, right = m
这里的right=m
而不是right=m-1
- 在偶数情况下,
(double) (Math.max(nums1LeftMax, nums2LeftMax) + Math.min(nums1RightMin, nums2RightMin)) / 2
要强转为double
,再除2保留小数 - 还有一种解法
while (left < right) {
int i = (left + right+1) / 2;
int j = totalLeft - i;
if (nums1[i-1]>nums2[j]) {
right = i - 1;
} else {
left = i;
}
}