题解 | 多数组中位数

多数组中位数

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;
            }
        }
    }
}

全部评论
求测试用例
点赞 回复 分享
发布于 05-24 23:18 湖北

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务