【LeetCode热题100(66/100)】寻找两个正序数组的中位数

题目地址: 链接

思路: 要想O(log(n + m))时间复杂度内实现当前算法。很显然是二分算法,而且需要将两个数组成为一个整体来想。

两个数组都是递增的,并且中位数的左边的内容是一样的,如果将问题转换为获取中位数的下标,那么思路就很清晰了。

  1. 获取两个数组下标。在 nums1 中选取一个下标 mid - 1,由于是两个数组的中位数,而且是两个有序数组,所以另外一个数组的下标是确定的totalN - mid - 1
  2. 选取两个下标的最大值,判断是否大于nums[q1 + 1],如果成立,说明当前成立,可以让左收拢;反之向右收拢。
  3. 重复1,知道 l < r 不成立
  4. 根据 n + m 的奇偶性来返回对应的中位数。
js 复制代码
/**
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @return {number}
 */

var findMedianSortedArrays = function(nums1, nums2) {
    function check_left(mid) {
        if(mid > n) return false;
        if(totalN - mid > m) return true;
        let [q1, q2] = [mid - 1, totalN - mid - 1];
        let maxValue = -Infinity;
        if(q1 >= 0) maxValue = Math.max(nums1[q1], maxValue);
        if(q2 >= 0) maxValue = Math.max(nums2[q2], maxValue);
        if(q1 + 1 < n && maxValue > nums1[q1 + 1]) return true;
        return false;
    }
    let [n, m] = [nums1.length, nums2.length];
    let totalN = n + m + 1 >> 1;
    let isOdd = (n + m) % 2;

    let [l, r] = [0, totalN];
    while(l < r) {
        let mid = l + r >> 1;
        if(check_left(mid)) l = mid + 1;
        else r = mid;
    }

    let ans = -Infinity;
    let [idx1, idx2] = [l - 1, totalN - l - 1]
    if(idx1 >= 0) ans = Math.max(ans, nums1[idx1]);
    if(idx2 >= 0) ans = Math.max(ans, nums2[idx2]);
    if(!isOdd) {
        let otherNum = Infinity
        if(l < n) {
            otherNum = Math.min(otherNum, nums1[l]);
        }
        if(totalN - l < m) {
            otherNum = Math.min(otherNum, nums2[totalN - l]);
        }
        ans = (ans + otherNum) / 2;
    }
    return ans;
};
相关推荐
爱看科技10 分钟前
微美全息(NASDAQ:WIMI)研究拜占庭容错联邦学习算法,数据安全与隐私保护的双重保障
算法
qq_4171292516 分钟前
C++中的桥接模式变体
开发语言·c++·算法
YuTaoShao1 小时前
【LeetCode 每日一题】3010. 将数组分成最小总代价的子数组 I——(解法二)排序
算法·leetcode·排序算法
XH华2 小时前
备战蓝桥杯,第七章:函数与递归
职场和发展·蓝桥杯
吴维炜2 小时前
「Python算法」计费引擎系统SKILL.md
python·算法·agent·skill.md·vb coding
Σίσυφος19003 小时前
PCL Point-to-Point ICP详解
人工智能·算法
玄〤4 小时前
Java 大数据量输入输出优化方案详解:从 Scanner 到手写快读(含漫画解析)
java·开发语言·笔记·算法
weixin_395448914 小时前
main.c_cursor_0202
前端·网络·算法
senijusene4 小时前
数据结构与算法:队列与树形结构详细总结
开发语言·数据结构·算法
杜家老五4 小时前
综合实力与专业服务深度解析 2026北京网站制作公司六大优选
数据结构·算法·线性回归·启发式算法·模拟退火算法