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

题目描述

解题思路

此题目直接遍历两个列表,时间复杂度为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;
    }
}

刷题链接

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

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-26 04:56:17       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-26 04:56:17       100 阅读
  3. 在Django里面运行非项目文件

    2024-05-26 04:56:17       82 阅读
  4. Python语言-面向对象

    2024-05-26 04:56:17       91 阅读

热门阅读

  1. 常见 HTTP 状态码及其含义

    2024-05-26 04:56:17       29 阅读
  2. Kafka消息丢失如何处理

    2024-05-26 04:56:17       30 阅读
  3. Sublime Text 基础教程(个人总结)

    2024-05-26 04:56:17       29 阅读
  4. RequestBodyAdvice和ResponseBodyAdvice是干什么的

    2024-05-26 04:56:17       34 阅读