`

两个有序数组合并找第k个元素

阅读更多

 

       暴力求解 : O(m + n)

       限定时间复杂度:O(lg(m + n))

 

       思路:

       设定两个数组A , B  amid , bmid分别为a ,b的中点

       比较A[amid] 与 B[mid]的值。

       只考虑A[mid] <= B[mid]的情况,分析清了这一种,另一种则是一模一样的。

       那么可以得到:

      B[mid] 前面一定有 amid + bmid + 1个元素

      A[mid]后面一定有 (m + n) - (amid + bmid + 1) 个元素

      

      接下来,就要看 k 是位于B[mid]的前面还是后面了:

      1 . k <= (amid + bmid + 1) : 那么这用情况就可以不用考虑bmid 及其后面的元素

       2. k >  (amid + bmid +1) : 那么这种情况就不要考虑amid 及其之前的元素了,只要在

           A[mid]之后的元素中找第(k - (amid + 1)) 个元素。

      这样,一路递归下去,不就省去了很多无关的计算了吗?

 

     代码实现:

        

int FindKth(int A[], int aL, int aR, int B[], int bL, int bR, int k) {
//递归出口 左边没元素了,那么就只能从B中[bL ,BR]段中找第k个元素
        if (aL > aR) return B[bL + k - 1];
        if (bL > bR) return A[aL + k - 1];

        int aMid = (aL + aR) / 2;
        int bMid = (bL + bR) / 2;

        if (A[aMid] <= B[bMid]) {
//分析为了简单 与k 比较时直接用的amid !
            if (k <= (aMid - aL) + (bMid - bL) + 1) 
                return FindKth(A, aL, aR, B, bL, bMid - 1, k);
            else
                return FindKth(A, aMid + 1, aR, B, bL, bR, k - (aMid - aL) - 1);
        }
        else { // A[aMid] > B[bMid]
            if (k <= (aMid - aL) + (bMid - bL) + 1) 
                return FindKth(A, aL, aMid - 1, B, bL, bR, k);
            else
                return FindKth(A, aL, aR, B, bMid + 1, bR, k - (bMid - bL) - 1);
        }

 

分享到:
评论

相关推荐

    归并算法之有序数组合并算法实现

    一个简单的有序数组合并算法:写一个函数,传入 2 个有序的整数数组,返回一个有序的整数数组。实现相当简单,创建一个长度为这两个长度之和的数组,然后分别用三个指针指向这三个数组,找到这两个数组中各个元素在...

    用递归和非递归两种方式实现归并排序

    归并排序是一种基于分治思想的排序算法,它将待排序的数组分成两部分,分别对这两部分递归地进行排序,最后将两个有序子数组合并成一个有序数组。它的时间复杂度为O(nlogn)。 归并排序的基本思路是将待排序的数组...

    数据结构和算法必知必会的50个代码实现

    ## 数组* 实现一个支持动态扩容的数组* 实现一个大小固定的有序数组,支持动态增删改操作* 实现两个有序数组合并为一个有序数组 ## 链表* 实现单链表、循环链表、双向链表,支持增删操作* 实现单链表反转* 实现两个...

    50个必会的数据结构及算法实现源码

    问题:实现两个有序数组合并为一个有序数组 链表 问题:实现单链表、循环链表、双向链表,支持增删操作 问题:实现单链表反转 问题:实现两个有序的链表合并为一个有序链表 问题:实现求链表的中间结点 栈 ...

    leetcode中国-Array:用Java练习数组

    在两有序数组找第K个最小数 FindNotDouble 找只出现一次的元素 FindOnlyDup 找只重复一次的元素 FindOnlyDupBetweenTwo 两数组找出唯一不同的元素 FindMaxRecursion 递归求最大值 FindMaxDiff 找最大差值(动态规划) ...

    leetcode岛屿的最大面积-LeetCode:标记我在https://leetcode.com/上练习的问题的解决方案

    leetcode岛屿的最大面积 本仓库记录 部分题目的解,其中使用的编程语言为 Go 其中题库跟随仓库: 更加全面题解: 目录 二分查找 求开方 抛硬币 有序数组中的 ...寻找两数平方和等于第三个数 ...寻找两个有序数组的中位数]

    计算机二级公共基础知识

    计算循环队列的元素个数:“尾指针减头指针”,若为负数,再加其容量即可。 1.5 链表 在链式存储方式中,要求每个结点由两部分组成:一部分用于存放数据元素值,称为数据域;另一部分用于存放指针,称为指针域。其中...

    LeetCode解题总结

    6.1 合并两个有序数组到其中一个数组 6.2 合并两个有序链表 6.3 合并K个有序链表 6.4 使用插入排序来排序链表 6.5 归并排序排序链表 6.6 第一个缺少的正数 6.7 排序颜色 7. 查找 7.1 在排序数组中查找数出现的范围 ...

    leetcode小岛出水口-OJCase:算法题LeetCode、剑指Offer

    LC21:两个有序链表的归并 LC23:K个有序数组归并为一个有序数组(Time exceeded,need to follow) LC24:交换链表的节点对 LC25:交换链表的K-group节点组 LC26:有序数组中去除重复元素 LC27:删除某个值 LC37:求解数独...

    leetcode双人赛-leetcodeSolution:Leetcode一站式解决方案(JAVA版,持续更新)

    两个有序数组的中位数 5 最长回文子串 6 之字形转换 7 反转整数 8 字符串到整数 (atoi) 9 回文数 10 正则表达式匹配 11 盛水的容器 12 整数转罗马 13 罗马到整数 14 最长公共前缀 15 3 和 16 3Sum 最近 电话号码的 ...

    世界500强面试题.pdf

    1.5.6. 输入两个整数 n 和 m,从数列 1,2,3.......n 中 随意取几个数 ....... 116 1.5.7. 输入一个表示整数的字符串,把该字符串转换成整数并输出.............. 118 1.5.8. 给出一个数列,找出其中最长的单调...

    leetcode安卓-leetcode_alg_practice:在LeetCode上破解1049个算法问题!(自2020-02-28)

    寻找两个有序数组的中位数 0005 最长回文子串 0006 Z 字形变换 0007 整数反转 0008 字符串转换整数 (atoi) 0009 回文数 0010 正则表达式匹配 0011 盛最多水的容器 0012 整数转罗马数字 0013 罗马数字转整数 0014 ...

    算法分析与设计习题集答案

    15、 利用分治策略,在n个不同元素中找出第k个最小元素。 16、 设有n个运动员要进行网球循环赛。设计一个满足以下要求的比赛日程表。 (1)每个选手必须与其它n-1选手各赛一次; (2)每个选手一天只能赛一次。 17、...

    leetcode双人赛-leetcode-go:leetcode-go

    合并两个有序数组 杨辉三角 杨辉三角 II 买卖股票的最佳时机 II 寻找旋转排序数组中的最小值 两数之和 II - 输入有序数组 多数元素 旋转数组 数组中的第K个最大元素 滑动窗口最大值 移动零 前 K 个高频元素 两个数组...

    leetcode各平台的价格区间-DemoLeetCode:桓酱的刷题仓库

    leetcode 各平台的价格区间 ...合并两个有序链表 lc 22 括号生成 lc 23 合并K个升序链表 lc 24 两两交换链表中的值 lc 25 K个一组翻转链表 lc 26 删除排序数组中的重复项 lc 27 移除元素 lc 28 实现strSt

    leetcode530-leetcode-practice:练习力码

    两个有序数组的中位数 5 最长回文子串 7 反转整数 8 字符串到整数 (atoi) 10 正则表达式匹配 11 盛水的容器 12 整数转罗马 13 罗马到整数 15 3 和 电话号码的 17 个字母组合 18 4 和 20 个有效括号 22 生成括号 23 ...

    javalruleetcode-Re0-LeetCode:从零开始的LeetCode

    两个有序数组的中位数 完毕 5 最长回文子串 完毕 7 反转整数 去做 8 字符串到整数 (atoi) 完毕 10 正则表达式匹配 去做 11 盛水的容器 完毕 12 整数转罗马 完毕 13 罗马到整数 完毕 15 3 和 完毕 电话号码的 17 个...

    LeetCode

    两个排序数组的中位数 最长回文子串 之字形转换 反向整数 字符串到整数(atoi) 回文数 装满水的容器 整数到罗马 罗马到整数 最长的公共前缀 3和 3Sum最近 电话号码的字母组合 4和 从列表末尾删除第N个节点 有效...

    有序保形域理论中的无序相关器和纯度

    我们的通用结果可以表示为模块化的S矩阵元素的特定组合,这些元素被称为Anyon单峰标量。 接下来,在SU(N)k WessZuminoWitten模型的显式设置中,我们比较了无序相关器的后期行为和纯度。 有趣的是,在大限度内,...

    leetcode安卓-leetcode-erlang:LeetCodeErlang题解

    寻找两个有序数组的中位数 困难 5 最长回文子串 中等 6 Z 字形变换 中等 7 整数反转 简单 8 字符串转换整数 (atoi) 中等 9 回文数 简单 10 正则表达式匹配 困难 11 盛最多水的容器 中等 12 整数转罗马数字 中等 13 ...

Global site tag (gtag.js) - Google Analytics