美文网首页
算法---寻找两个有序数组的中间点

算法---寻找两个有序数组的中间点

作者: reedthinking | 来源:发表于2017-06-23 20:18 被阅读0次

给定两个有序数组a1,a2,长度分别是m,n。寻找这两个数组的中间点。例如
a1 = [1, 2]
a2 = [3,4]
中点是2.5

算法思路来自https://discuss.leetcode.com/topic/16797/very-concise-o-log-min-m-n-iterative-solution-with-detailed-explanation
以下代码是kotlin版本实现

/**
 * Created by thinkreed on 2017/6/23.
 */

fun findMedianOfTwoArray(a1: Array<Int>, a2: Array<Int>): Double {

    //保证a2比a1短
    if (a1.size < a2.size) return findMedianOfTwoArray(a2, a1)

    //a2为空,返回a1的中间点
    if (a2.isEmpty()) return (a1[(a1.size - 1) / 2].toDouble() + a1[a1.size / 2].toDouble()) / 2

    var low = 0
    var high = 2 * a2.size

    //二分查找均分点
    while (low <= high) {
        //以中点切分
        val mid2 = (low + high) / 2
        //通过mid2推断mid1,若mid1和mid2是两数组的两个切分点,则满足mid1+mid2 = a1.size + a2.size
        val mid1 = a1.size + a2.size - mid2

        //L1,R1分别表示数组a1的切分点C1的左相邻元素,右相邻元素
        //L2,R2分别表示数组a2的切分点C2的左相邻元素,右相邻元素
        val L1 = if (mid1 == 0) Int.MIN_VALUE else a1[(mid1 - 1) / 2]
        val L2 = if (mid2 == 0) Int.MIN_VALUE else a2[(mid2 - 1) / 2]
        val R1 = if (mid1 == 2 * a2.size) Int.MAX_VALUE else a1[mid1 / 2]
        val R2 = if (mid2 == 2 * a2.size) Int.MAX_VALUE else a2[mid2 / 2]

        //a1的左边部分太大了,将切分点C1左移,C2相应得右移
        if (L1 > R2) low = mid2 + 1
        //a2的左边部分太大了,将切分点C2左移,C1相应右移
        else if (L2 > R1) high = mid2 - 1
        //满足条件L1<=R2 && L2<=R1
        else return (maxOf(L1, L2).toDouble() + minOf(R1, R2).toDouble()) / 2
    }

    return -1.0
}

相关文章

  • 算法---寻找两个有序数组的中间点

    给定两个有序数组a1,a2,长度分别是m,n。寻找这两个数组的中间点。例如a1 = [1, 2]a2 = [3,4...

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

    题目:4. 寻找两个有序数组的中位数 难度:困难 分类:数组 解决方案:二分查找、分治算法 今天我们学习第4题寻找...

  • 2018-11-29 寻找两个有序数组的中位数

    题目: 4. 寻找两个有序数组的中位数 解法: 解法一:最简单的办法就是合并两个有序数组, 因为数组有序, 所以很...

  • 二分查找法

    二分查找算法是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的...

  • 【leetcode边做边学】二分查找应用

    二分查找 二分查找算法是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好...

  • 排序算法05:归并排序

    算法介绍 归并排序的算法逻辑为把两个有序的数组归并为一个有序的数组。 举个例子,对于一个长度为8的数组,有两种归并...

  • Python寻找两个有序数组的中位数

    Python寻找两个有序数组的中位数 审题: 找出意味着这是一个查找算法题 算法复杂度log级别,就是提示你是二分...

  • 二分查找算法

    二分查找算法或者折半查找算法,是一种在有序数组中查找某一特定元素的搜索算法。 搜索过程从数组的中间元素开始,如果中...

  • 圆滑曲线画法

    Catmull-Rom算法根据四个点计算中间前后两个点位辅助点 pointArray:点的数组pointCount...

  • 寻找两个有序数组的中位数

    数组篇 寻找两个有序数组的中位数 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。 请你找出这...

网友评论

      本文标题:算法---寻找两个有序数组的中间点

      本文链接:https://www.haomeiwen.com/subject/abxhcxtx.html