栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

LeetCode4.寻找两个正序数组的中位数(Java代码)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

LeetCode4.寻找两个正序数组的中位数(Java代码)

LeetCode4.寻找两个正序数组的中位数 一:题目描述 4. 寻找两个正序数组的中位数

难度困难4868

给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。

算法的时间复杂度应该为 O(log (m+n)) 。

示例 1:

输入:nums1 = [1,3], nums2 = [2]
输出:2.00000
解释:合并数组 = [1,2,3] ,中位数 2

示例 2:

输入:nums1 = [1,2], nums2 = [3,4]
输出:2.50000
解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5

示例 3:

输入:nums1 = [0,0], nums2 = [0,0]
输出:0.00000

示例 4:

输入:nums1 = [], nums2 = [1]
输出:1.00000

示例 5:

输入:nums1 = [2], nums2 = []
输出:2.00000

提示:

nums1.length == mnums2.length == n0 <= m <= 10000 <= n <= 10001 <= m + n <= 2000-106 <= nums1[i], nums2[i] <= 106 二:思路讲解

创建两个堆 

一个大顶堆

一个小顶堆

让两个数组平均的放到两个堆中

那么 小顶堆的顶堆是该堆最大值 大顶堆的顶堆是该堆最小值

如果两个堆数据量不相同 取堆容量大的堆顶

如果两个堆数量相同 取两个堆顶的平均值

你品.......你想........你仔细韵味一下
三:Java代码
public class LeetCode4 {
    public static void main(String[] args) {

        int[] arr1 = {1, 3, 5, 6};
        int[] arr2 = {2, 4,};
        
        System.out.println(model(arr1, arr2));

    }


    private static double model(int[] arr1, int[] arr2) {

        // 创建大顶堆、创建小顶堆
        PriorityQueue max = new PriorityQueue<>();
        // 堆顶是最大值 则为小顶堆 需要逆序
        PriorityQueue min = new PriorityQueue<>((o1, o2) -> o2 - o1);

        // 添加元素到堆中
        int arr1Len = addElement(max, min, arr1, 0);

        int totalLen = addElement(max, min, arr2, arr1Len);

        return findMedianSortedArrays(max, min, totalLen);
    }

    private static int addElement(PriorityQueue max, PriorityQueue min, int[] arrs, int num) {
        for (int e : arrs) {
            if (num++ % 2 == 0) {
                min.add(e);
                max.add(min.poll());
            } else {
                max.add(e);
                min.add(max.poll());
            }
        }
        return num;
    }

    public static double findMedianSortedArrays(PriorityQueue max, PriorityQueue min, int num) {
        // 如果两个堆数据量不相同 取堆容量大的堆顶
        //如果两个堆数量相同 取两个堆顶的平均值
        if (num % 2 != 0) {
            return (double) max.peek();
        } else {
            return (max.peek() + min.peek()) / 2.0;
        }
    }

}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/703121.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号