int m = nums1.length; int n = nums2.length; //分割线左边的所有元素需要满足的个数(m + n + 1) / 2 int totalLeft = (m + n + 1) / 2; //在 nums1 的区间 [0, m]里查找恰当的分割线 //使得 nums1[i - 1] <= nums2[j] && nums2[j - 1] <= nums1[i] //在较小长度的数组使用二分查找 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]){//不满足交叉小于的情况 //下一轮搜索区间 [left, i - 1] right = i - 1; }else{ //下一轮搜索区间 [i, right] left = i; } }
int i = left; int j = totalLeft - i; int nums1LeftMax = i == 0 ? Integer.MIN_VALUE : nums1[i - 1]; int nums1RightMin = i == m ? Integer.MAX_VALUE : nums1[i]; int nums2LeftMax = j == 0 ? Integer.MIN_VALUE : nums2[j - 1]; int nums2RightMIn = j == n ? Integer.MAX_VALUE : nums2[j];