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

LeetCode4.寻找两个正序数组的中位数

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

难度困难4868

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

算法的时间复杂度应该为 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 == m
  • nums2.length == n
  • 0 <= m <= 1000
  • 0 <= n <= 1000
  • 1 <= m + n <= 2000
  • -106 <= nums1[i], nums2[i] <= 106
二:思路讲解
创建两个堆 

一个大顶堆

一个小顶堆

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

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

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

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

你品.......你想........你仔细韵味一下
三:Java代码
/**
 * @author: vfudongyang
 * @createTime: 2022年01月06日 19:03:00
 * @Description: leetcode 4.寻找两个正序数组的中位数
 */
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<Integer> max = new PriorityQueue<>();
        // 堆顶是最大值 则为小顶堆 需要逆序
        PriorityQueue<Integer> 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<Integer> max, PriorityQueue<Integer> 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<Integer> max, PriorityQueue<Integer> min, int num) {
        // 如果两个堆数据量不相同 取堆容量大的堆顶
        //如果两个堆数量相同 取两个堆顶的平均值
        if (num % 2 != 0) {
            return (double) max.peek();
        } else {
            return (max.peek() + min.peek()) / 2.0;
        }
    }

}

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值