数组-在两个长度相等的有序数组中找到上中位数

题目描述

解题思路

此题目直接遍历两个列表,时间复杂度为O(n);使用二分法去比较两个递增列表的中位数,缩小两个数组中位数范围,时间复杂度O(logn),这里我们的算法实现使用二分法。

通过举例子来说明解题算法:

在循环过程中,每时每刻都保持两个比较列表的长度是相等的

1.当两个列表 [low1,high1] [low2,high2] 的中位数相等时:

        [1,3,4,5]和[2,3,5,6]=[1,2,3,3,4,5,5,6]

        [1,4,5,6,7]和[2,3,5,7,8]=[1,2,3,4,5,5,6,7,7,8]

可以看到,无论(high1-low1+1)是奇数还是偶数,当arr[mid]相等时,上中位数就是arr[mid]

2.当两个列表 [low1,high1] [low2,high2] 的中位数arr1[mid1]<arr2[mid2]时:

        当(high1-low1+1)是奇数时:[1,2,4,8,9] 和 [2,3,5,7,9]  low1=mid1;high2 = mid2;

        当(high1-low1+1)是偶数时:[1,2,4,8] 和 [2,3,4,7]        low1=mid1+1;high2 = mid2;

        缩小范围到黄色加粗内。

3.当两个列表 [low1,high1] [low2,high2] 的中位数arr1[mid1]>arr2[mid2]时:

        当(high1-low1+1)是奇数时:[1,5,7,8,9] 和 [2,3,5,7,9]  low2=mid2;high1 = mid1;

        当(high1-low1+1)是偶数时:[1,5,7,8] 和 [2,3,4,7]        low2=mid2+1;high1 = mid1;

        缩小范围到黄色加粗内。

4.最后返回arr1[low1]和arr2[low2]中的较小者。

代码实现

import java.util.*;

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * find median in two sorted array
     * @param arr1 int整型一维数组 the array1
     * @param arr2 int整型一维数组 the array2
     * @return int整型
     */

    //这里直接遍历两个列表,时间复杂度为O(n)
    //使用二分法去比较两个递增列表的中位数,缩小两个数组中位数范围,时间复杂度O(logn)

    public int findMedianinTwoSortedAray (int[] arr1, int[] arr2) {
        // 这里使用二分法
        int res = 0;
        int low1 = 0, high1 = arr1.length - 1;
        int low2 = 0, high2 = arr2.length - 1;
        while (low1 < high1) {
            int mid1 = (low1 + high1) / 2;
            int mid2 = (low2 + high2) / 2;
            if (arr1[mid1] == arr2[mid2]) {
                //这个不管是奇数还是偶数都成立:
                //[1,3,4,5]和[2,3,5,6]=[1,2,3,3,4,5,5,6]
                //[1,4,5,6,7]和[2,3,5,7,8]=[1,2,3,4,5,5,6,7,7,8]
                low1 = mid1;
                low2 = mid2;
                break;
            } else if (arr1[mid1] < arr2[mid2]) {
                if ((high1 - low1 + 1) % 2 == 1) { //如果high1-low1+1为奇数
                    //比如[1,2,4,8,9]和[2,3,5,7,9]
                    low1 = mid1;
                    high2 = mid2;
                } else { //如果high1-low1+1为偶数
                    //比如[1,2,4,8]和[2,3,4,7]
                    low1 = mid1 + 1;
                    high2 = mid2;
                }
            } else {
                if ((high1 - low1 + 1) % 2 == 1) { //如果high1-low1+1为奇数
                    //比如[1,5,7,8,9]和[2,3,5,7,9]
                    low2 = mid2;
                    high1 = mid1;
                } else { //如果high1-low1+1为偶数
                    //比如[1,5,7,8]和[2,3,4,7]
                    high1 = mid1;
                    low2 = mid2 + 1;
                }
            }
        }
        res = arr1[low1] < arr2[low2] ? arr1[low1] : arr2[low2];
        return res;
    }
}

刷题链接

在两个长度相等的排序数组中找到上中位数_牛客题霸_牛客网

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值