https://leetcode-cn.com/problems/median-of-two-sorted-arrays/
解题思路:使用两层二分查找
public class Solution
{
//数组中小于target的数字数量
int SearchLeftCount(int target, int[] numbers) {
int left = 0;
int right = numbers.Length;
while (left < right) {
int mid = (left + right) >> 1;
if (target <= numbers[mid]) {
right = mid;
} else {
left = mid + 1;
}
}
return left;
}
//数组中大于target的数字数量
int SearchRightCount(int target, int[] numbers) {
int left = 0;
int right = numbers.Length;
while (left < right) {
int mid = (left + right) >> 1;
if (numbers[mid] <= target) {
left = mid + 1;
}
else {
right = mid;
}
}
return numbers.Length - left;
}
//数组中与target相同的数字数量
public int SearchSameCount(int target, int[] numbers) {
int leftCount = SearchLeftCount(target, numbers);
int rightCount = SearchRightCount(target, numbers);
return numbers.Length - leftCount - rightCount;
}
//在nums1中查找nums1和nums2的中位数,offset用于查找第二个中位数
double? SearchMidNumber(int[] nums1, int[] nums2, int offset = 0) {
double? result = null;
int left = 0;
int right = nums1.Length;
int numberCount = nums1.Length + nums2.Length;
//中位数是第几个数
int targetIndex = ((numberCount + 1) >> 1) + offset;
while (left < right) {
int mid = (left + right) >> 1;
//nums1中等于nums1[mid]的左开右闭区间
int left1 = SearchLeftCount(nums1[mid], nums1);
int right1 = nums1.Length - SearchRightCount(nums1[mid], nums1);
//nums2中等于nums1[mid]的左开右闭区间
int left2 = SearchLeftCount(nums1[mid], nums2);
int right2 = nums2.Length - SearchRightCount(nums1[mid], nums2);
if (left1 + left2 < targetIndex && targetIndex <= right1 + right2) {
//在区间内nums1[mid]就是中位数
result = nums1[mid];
break;
}
else if (targetIndex <= left1 + left2) {
right = left1;
}
else if (right1 + right2 < targetIndex) {
left = right1;
}
}
if (null == result) {
return null;
}
if (0 == offset && ((nums1.Length + nums2.Length) & 1) != 1) {
//偶数要求出两个中位数再求平均值
double? result1 = SearchMidNumber(nums1, nums2, 1);
if (null == result1) {
result1 = SearchMidNumber(nums2, nums1, 1);
}
if (null == result1) {
return null;
}
return (result.Value + result1.Value) / 2;
}
return result;
}
public double FindMedianSortedArrays(int[] nums1, int[] nums2) {
//先在nums1中找第一个数
double? result = SearchMidNumber(nums1, nums2);
if (null == result) {
//在nums2中找第一个数
result = SearchMidNumber(nums2, nums1);
}
return result.Value;
}
}