博客
关于我
这道算法题太简单?你忽略了时间复杂度的要求!
阅读量:678 次
发布时间:2019-03-16

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

LeetCode 4. 寻找两个有序数组的中位数

题目大意是给定两个有序数组 nums1 和 nums2,要求找到它们合并后的中位数,并且要保证算法的时间复杂度为 O(log(m + n)),其中 m 和 n 分别是两个数组的长度。


题目解析

中位数是两个数组合并后按照大小顺序排列后的中间值。对于偶数个元素的情况,中位数是中间两个数的平均值。对于奇数个元素,则是中间的那个数。

常规的解法是将两个数组合并后进行排序,然后找到中间的元素。然而,这种方法的时间复杂度为 O(m + n),无法满足题目要求的 O(log(m + n)) 高效率。


动作描述

我们需要通过二分查找的方法来找到两个有序数组中的中位数。具体思路如下:

  • 确定中位数的位置

    首先,计算两个数组的总长度的中位数位置 k。

    • 如果数组总长度为奇数,k 是中间的那个位置。
    • 如果总长度为偶数,k 会取中间两个位置的平均值的位置。
  • 在两个数组中同时查找第 k 小的元素

    我們需要同时在 nums1 和 nums2 中查找第 k 小的元素。

    • 比较两个数组中当前位置的元素,决定继续查找的方向。
    • 每次查找缩小范围,因此时间复杂度为 O(log(m + n))。
  • 计算中位数

    然后将两个数组中第 k 小的元素相加,取平均值即可得到中位数。


  • 代碼實現

    public double findMedianSortedArrays(int[] nums1, int[] nums2) {    int n = nums1.length;    int m = nums2.length;    int left = (n + m + 1) / 2;    int right = (n + m + 2) / 2;    int k1 = getKth(nums1, 0, n - 1, nums2, 0, m - 1, left);    int k2 = getKth(nums1, 0, n - 1, nums2, 0, m - 1, right);    return (k1 + k2) * 0.5;}private int getKth(int[] nums1, int start1, int end1, int[] nums2,                   int start2, int end2, int k) {    int len1 = end1 - start1 + 1;    int len2 = end2 - start2 + 1;    if (len1 > len2) {        return getKth(nums2, start2, end2, nums1, start1, end1, k);    }    if (len1 == 0) {        return nums2[start2 + k - 1];    }    if (k == 1) {        return Math.min(nums1[start1], nums2[start2]);    }    int i = start1 + (Math.min(len1, k / 2) - 1);    int j = start2 + (Math.min(len2, k / 2) - 1);    if (nums1[i] > nums2[j]) {        return getKth(nums1, start1, end1, nums2, j + 1, end2, k - (j - start2 + 1));    } else {        return getKth(nums1, i + 1, end1, nums2, start2, end2, k - (i - start1 + 1));    }}

    了容分析

    • 时间複雜度:每次查找都将查找范围缩小一半,因此整体复雜度为 O(log(m + n))。
    • 空間複雜度:使用了递归,但尾蹓尾噬ợi壽命小,因此空間複雜度是 O(1)。

    参考內容

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

    你可能感兴趣的文章
    OpenCV与AI深度学习 | 基于机器视觉的磁瓦表面缺陷检测方案
    查看>>
    Opencv中KNN背景分割器
    查看>>
    OpenCV中基于已知相机方向的透视变形
    查看>>
    opencv保存图片路径包含中文乱码解决方案
    查看>>
    opencv图像分割2-GMM
    查看>>
    OpenCV:概念、历史、应用场景示例、核心模块、安装配置
    查看>>
    Openlayers高级交互(10/20):绘制矩形,截取对应部分的地图并保存
    查看>>
    Openlayers高级交互(19/20): 地图上点击某处,列表中显示对应位置
    查看>>
    openlayers:圆孔相机根据卫星经度、纬度、高度、半径比例推算绘制地面的拍摄的区域
    查看>>
    OpenMCU(一):STM32F407 FreeRTOS移植
    查看>>
    OpenMMLab | 【全网首发】Llama 3 微调项目实践与教程(XTuner 版)
    查看>>
    OpenMMLab | 面向多样应用需求,书生·浦语2.5开源超轻量、高性能多种参数版本
    查看>>
    OpenPPL PPQ量化(4):计算图的切分和调度 源码剖析
    查看>>
    OpenPPL PPQ量化(5):执行引擎 源码剖析
    查看>>
    Openresty框架入门详解
    查看>>
    OpenResty(2):OpenResty开发环境搭建
    查看>>
    openshift搭建Istio企业级实战
    查看>>
    Openstack 之 网络设置静态IP地址
    查看>>
    OpenStack 网络服务Neutron详解
    查看>>
    Openstack(两控制节点+四计算节点)-1
    查看>>