LeetCode【4. 寻找两个正序数组的中位数】

快乐安康

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

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

复制代码
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
    if (nums1.length > nums2.length) {
        return findMedianSortedArrays(nums2, nums1);
    }
    int x = nums1.length;
    int y = nums2.length;
    int low = 0, high = x;
    while (low <= high) {
        int partitionX = (low + high) / 2;
        int partitionY = (x + y + 1) / 2 - partitionX;

        int maxX = (partitionX == 0) ? Integer.MIN_VALUE : nums1[partitionX - 1];
        int maxY = (partitionY == 0) ? Integer.MIN_VALUE : nums2[partitionY - 1];

        int minX = (partitionX == x) ? Integer.MAX_VALUE : nums1[partitionX];
        int minY = (partitionY == y) ? Integer.MAX_VALUE : nums2[partitionY];

        if (maxX <= minY && maxY <= minX) {
            if ((x + y) % 2 == 0) {
                return (double) (Math.max(maxX, maxY) + Math.min(minX, minY)) / 2;
            } else {
                return (double) Math.max(maxX, maxY);
            }
        } else if (maxX > minY) {
            high = partitionX - 1;
        } else {
            low = partitionX + 1;
        }
    }
    throw new IllegalArgumentException("Input arrays are not sorted.");
}
相关推荐
程序员岳焱1 分钟前
Java高级反射实战:15个场景化编程技巧与底层原理解析
java·后端·编程语言
程序员小假1 分钟前
说一说 Netty 中的心跳机制
java·后端
FogLetter2 分钟前
微信红包算法揭秘:从随机性到产品思维的完美结合
算法
真实的菜9 分钟前
消息队列处理模式:流式与批处理的艺术
java
盖世英雄酱5813624 分钟前
Java 内存管理技巧(新手必看集合篇)
java
码农小灰26 分钟前
Java 8 Stream API 入门到实践详解
java·java案例
BUG收容所所长28 分钟前
二分查找的「左右为难」:如何优雅地找到数组中元素的首尾位置
前端·javascript·算法
梨子同志29 分钟前
手动实现 JavaScript 的 call、apply 和 bind 方法
前端·javascript
梨子同志30 分钟前
ES6 let 和 const
前端·javascript
步、步、为营31 分钟前
.NET 事件模式举例介绍
java·开发语言·.net