题解 | 多数组中位数
多数组中位数
https://www.nowcoder.com/practice/b6bb0bce88894108bfc23e9b7b012420
import java.util.*;
public class Solution {
/**
*
*/
public int getUpMedian (int[] arr1, int[] arr2) {
int mid = (arr1.length + arr2.length - 1) / 2 + 1; //下中位数的下标+1 -> 第mid个数
int len1 = arr1.length;
int len2 = arr2.length;
// 记录两个数组的当前起始边界(相当于逻辑上切除已被排除的前缀)
int index1 = 0;
int index2 = 0;
while (true) {
// 边界情况 1:如果 arr1 已经全部被排除,直接在 arr2 中找
if (index1 == len1) {
return arr2[index2 + mid - 1];
}
// 边界情况 2:如果 arr2 已经全部被排除,直接在 arr1 中找
if (index2 == len2) {
return arr1[index1 + mid - 1];
}
// 边界情况 3:如果 mid 降到了 1,只需比较两个数组当前的头部,返回较小的那个
if (mid == 1) {
return Math.min(arr1[index1], arr2[index2]);
}
// 正常情况:每次取 target / 2 进行比较
int half = mid / 2;
// 防止下标越界,如果数组剩余长度不足 half,则取到数组末尾
int newIndex1 = Math.min(index1 + half - 1, len1 - 1);
int newIndex2 = Math.min(index2 + half - 1, len2 - 1);
int pivot1 = arr1[newIndex1];
int pivot2 = arr2[newIndex2];
// 比较两处的数值,谁小就排除谁的前缀
if (pivot1 <= pivot2) {
mid -= (newIndex1 - index1 + 1);
index1 = newIndex1 + 1;
} else {
mid -= (newIndex2 - index2 + 1);
index2 = newIndex2 + 1;
}
}
}
}

