题目
二分查找
class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int m = nums1.length;
int n = nums2.length;
if (m > n) {
return findMedianSortedArrays(nums2, nums1);
}
// 整数除法向下取整保持奇偶一致
// 分割线左边的总节点数
int totalLeft = (m + n + 1) / 2;
int left = 0;
int right = m;
while (left < right) {
int i = left + (right - left + 1) / 2;
int j = totalLeft - i;
// 第一个数组分割线左边的最大值大于第二个数组分割线右边的最小值
if (nums1[i - 1] > nums2[j]) {
right = i - 1;
} else {
left = i;
}
}
int i = left;
int j = totalLeft - i;
int nums1MaxLeft = i == 0 ? Integer.MIN_VALUE : nums1[i - 1];
int nums1MinRight = i == m ? Integer.MAX_VALUE : nums1[i];
int nums2MaxLeft = j == 0 ? Integer.MIN_VALUE : nums2[j - 1];
int nums2MinRight = j == n ? Integer.MAX_VALUE : nums2[j];
if ((m + n) % 2 == 1) {
return Math.max(nums1MaxLeft, nums2MaxLeft);
}
return (Math.max(nums1MaxLeft, nums2MaxLeft) + Math.min(nums1MinRight, nums2MinRight)) / 2d;
}
}
第二种写法
class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int m = nums1.length;
int n = nums2.length;
if (m > n) {
return findMedianSortedArrays(nums2, nums1);
}
// 整数除法向下取整保持奇偶一致
// 分割线左边的总节点数
int totalLeft = (m + n + 1) / 2;
int left = 0;
int right = m;
while (left < right) {
int i = left + (right - left) / 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 nums1MaxLeft = i == 0 ? Integer.MIN_VALUE : nums1[i - 1];
int nums1MinRight = i == m ? Integer.MAX_VALUE : nums1[i];
int nums2MaxLeft = j == 0 ? Integer.MIN_VALUE : nums2[j - 1];
int nums2MinRight = j == n ? Integer.MAX_VALUE : nums2[j];
if ((m + n) % 2 == 1) {
return Math.max(nums1MaxLeft, nums2MaxLeft);
}
return (Math.max(nums1MaxLeft, nums2MaxLeft) + Math.min(nums1MinRight, nums2MinRight)) / 2d;
}
}