【LeetCode4.寻找两个正序数组的中位数】二分O(log(m+n))

题目链接

4. 寻找两个正序数组的中位数 - 力扣(LeetCode)

实现思路

  • **本质上,其实就是求两个数组第k大的数的变式。**设两个数组大小为m、n,则总长度为t=m+n,那么如果t为奇数,求的就是两个数组第t/2+1大的数;如果t为偶数,求的就是两个数组第t/2和第t/2+1大的数的平均数。
  • 那么,求两个数组第k大的数,每次判断当前数组第k/2大的数的大小关系,如果数组1对应的位置aj小于数组2对应位置bj的元素,那么aj连同之前的数字,必然不可能是第k大的数!这样的话,就移动数组1的开始下标,并且k减去k/2,再次计算当前开始下标的条件下,两个数组第k(其实就是上一次的k-k/2)大的元素。

可以大致看一下下面的图解:

代码实现

cpp 复制代码
class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        int m = nums1.size();
        int n = nums2.size();
        int t = m + n;
        if (t % 2) {
            return find(nums1, 0, m - 1, nums2, 0, n - 1, t / 2 + 1);
        } else {
            return (find(nums1, 0, m - 1, nums2, 0, n - 1, t / 2) + 
                find(nums1, 0, m - 1, nums2, 0, n - 1, t / 2 + 1)) / 2.0;
        }
    }
    // 找到两个数组中合并后第k大的数
    int find(vector<int>& nums1, int astart, int aend, vector<int>& nums2, int bstart, int bend, int k) {
        if (astart > aend) {
            return nums2[bstart + k - 1];
        }
        if (bstart > bend) {
            return nums1[astart + k - 1];
        }
        if (k == 1) {
            return min(nums1[astart], nums2[bstart]);
        }
        int q = k / 2;
        // 注意边界判断
        int aj = min(astart + q - 1, aend);
        int bj = min(bstart + q - 1, bend);
        if (nums1[aj] <= nums2[bj]) {
            return find(nums1, aj + 1, aend, nums2, bstart, bend, k - (aj - astart + 1));
        } else {
            return find(nums1, astart, aend, nums2, bj + 1, bend, k - (bj - bstart + 1));
        }
    }
};
相关推荐
Yzzz-F2 小时前
Problem - 2205D - Codeforces
算法
智者知已应修善业3 小时前
【51单片机2个按键控制流水灯运行与暂停】2023-9-6
c++·经验分享·笔记·算法·51单片机
Halo_tjn3 小时前
Java Set集合相关知识点
java·开发语言·算法
生成论实验室3 小时前
《事件关系阴阳博弈动力学:识势应势之道》第四篇:降U动力学——认知确定度的自驱演化
人工智能·科技·神经网络·算法·架构
AI科技星4 小时前
全域数学·72分册:场计算机卷【乖乖数学】
算法·机器学习·数学建模·数据挖掘·量子计算
云泽8084 小时前
C++11 核心特性全解:列表初始化、右值引用与移动语义实战
开发语言·c++
科研前沿4 小时前
镜像孪生VS视频孪生核心技术产品核心优势
大数据·人工智能·算法·重构·空间计算
水蓝烟雨4 小时前
1931. 用三种不同颜色为网格涂色
算法·leetcode
AI进化营-智能译站5 小时前
ROS2 C++开发系列12-用多态与虚函数构建可扩展的ROS2机器人行为模块
开发语言·c++·ai·机器人
晨曦夜月5 小时前
map与unordered_map区别
算法·哈希算法