博客
关于我
leetcode题解4-寻找两个正序数组的中位数
阅读量:792 次
发布时间:2023-01-31

本文共 2714 字,大约阅读时间需要 9 分钟。

给定两个大小分别为 m 和 n 的正序数组 nums1 和 nums2,目标是找到这两个数组的中位数,并且时间复杂度为 O(log(m + n))。

方法思路

为了高效地找到两个已排序数组的中位数,我们可以利用二分查找的策略,这样可以将问题拆分为更小的子问题,每一步都能将搜索空间减半,从而达到 O(log(m + n)) 的时间复杂度。

具体步骤如下:

  • 计算两个数组的总长度 sum = m + n。
  • 确定中位数的中间位置 k = (sum) / 2(索引从0开始)。
  • 使用二分查找分别在两个数组 nums1 和 nums2 中找到 k 的位置。
    • 如果 nums1 的长度不够,取自 nums2。
    • 如果 nums2 的长度不够,取自 nums1。
  • 比较这两个位置的值,确定较小的值作为当前解。
  • 将问题重新拆分,继续在较小的范围内查找,直到找到确定的中位数。
  • 这个方法基于分而治之,每一步都能将问题规模减半,从而保证了高效性和时间复杂度符合要求。

    代码实现

    import java.util.ArrayList;class Solution {    public double findMedianSortedArrays(int[] nums1, int[] nums2) {        int m = nums1.length;        int n = nums2.length;        int sum = m + n;        // 确定中间位置k(索引从0开始)        int k = sum / 2;        // 初始化两个指针        int i = 0, j = 0;        // 调用二分查找方法确定中位数位置        return findMedianByBinarySearch(nums1, nums2, m, n, k);    }        public int findElement(int[] array, int index, int m) {        // 二分查找在数组中第index位置的元素        int left = 0, right = m - 1;        int pos = -1;        while (left <= right) {            int mid = (left + right) / 2;            if (array[mid] < index) {                left = mid + 1;            } else {                right = mid - 1;                pos = mid;            }        }        return array[pos];    }        public double findMedianByBinarySearch(int[] nums1, int[] nums2, int m, int n, int k) {        int left = 0, right = Math.min(m, n) - 1;        while (left <= right) {            int mid = (left + right) / 2;            int arr1 = 0, arr2 = 0;            if (mid < m) {                arr1 = nums1[mid];            }            if (mid < n) {                arr2 = nums2[mid];            }            if (arr1 <= arr2) {                if (mid >= m) {                    return arr2;                } else if (mid >= n) {                    return arr1;                } else {                    k -= (mid + 1);                    right = mid - 1;                }            } else {                if (mid >= n) {                    return arr1;                } else if (mid >= m) {                    return arr2;                } else {                    k -= (mid + 1);                    left = mid + 1;                }            }        }        // 计算中位数        if (k % 2 == 1) {            int mid = k / 2;            if (mid < m) return nums1[mid];            else return nums2[mid];        } else {            int mid = k / 2;            double average = (nums1[mid] + nums2[mid]) / 2.0;            return average;        }    }}

    代码解释

  • findMedianSortedArrays: 主函数,计算两个数组的总长度,并调用二分查找辅助函数来确定中位数。
  • findElement: 二分查找函数,用于找到指定索引位置的元素。
  • findMedianByBinarySearch: 核心优化版本,通过二分查找确定中位数,效率更高,时间复杂度为 O(log(m + n))。
  • 这种方法充分利用了两个数组已经排序的特性,通过分而治之策略,每一步都将问题规模减半,确保了算法的高效性和时间复杂度的低。

    转载地址:http://degyk.baihongyu.com/

    你可能感兴趣的文章
    2024数字安全创新性案例报告,从零基础到精通,收藏这篇就够了!
    查看>>
    2024最新最全CTF入门指南(非常详细)零基础入门到精通,收藏这一篇就够了
    查看>>
    2024最新科普什么是大模型?零基础入门到精通,收藏这篇就够了
    查看>>
    2024最新程序员接活儿搞钱平台盘点
    查看>>
    2024最火专业解读:信息安全(非常详细)零基础入门到精通,收藏这一篇就够了
    查看>>
    2025版最新C++快速入门(适合小白)零基础入门到精通,收藏这篇就够了
    查看>>
    2025版最新一文彻底搞懂大模型 - Agent(非常详细)零基础入门到精通,收藏这篇就够了
    查看>>
    2025版最新关于HW护网行动的一些知识,零基础入门到精通,收藏这篇就够了
    查看>>
    2025版最新大模型开发流程(非常详细)零基础入门到精通,收藏这一篇就够了
    查看>>
    2025版最新大模型微调方法(非常详细)零基础入门到精通,收藏这篇就够了
    查看>>
    2025版最新大语言模型的指令微调,零基础入门到精通,收藏这篇就够了
    查看>>
    2025版最新小白学习大模型:什么是大模型?零基础入门到精通,收藏这篇就够了
    查看>>
    2025版最新常用黑客工具之【Nmap 教程基础】零基础入门到精通,收藏这篇就够了
    查看>>
    2025版最新渗透测试和黑客工具列表,零基础入门到精通,收藏这一篇就够了
    查看>>
    2025版最新网络安全等级保护测评指南,零基础入门到精通,收藏这篇就够了
    查看>>
    2025版最新运维怎么转行网络安全?零基础入门到精通,收藏这篇就够了
    查看>>
    2025版最新黑客学习网站(非常详细),零基础入门到精通,看这一篇就够了
    查看>>
    23张图告诉你组建一个网络需要用到哪些硬件设备?路由器、交换机、防火墙是不是就够了?
    查看>>
    #12 btrfs文件系统
    查看>>
    CentOS 7 巨大变动之 systemd 取代 SysV的Init
    查看>>