`

两个有序数组合并找第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);
        }

 

分享到:
评论

相关推荐

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

    归并算法是一种常用的排序算法,通过将两个有序数组合并成一个有序数组来实现排序。 算法思想 归并算法的思想是将两个有序数组合并成一个有序数组。我们可以使用三个指针,分别指向两个数组和一个合并数组。然后,...

    凯撒密码合并两个有序数组

    合并两个有序数组是指,给定两个已排序的整数数组arr1和arr2,我们需要创建一个新的数组,该数组包含两个输入数组的所有元素,并且仍然保持排序顺序。 ### 算法步骤: 1. 初始化三个指针:`i` 对应于 `arr1` 的...

    python-leetcode面试题解之第88题合并两个有序数组-题解.zip

    给定两个有序整数数组`nums1`和`nums2`,其长度分别为`m`和`n`,目标是将这两个有序数组合并成一个新的有序数组,并存储在`nums1`数组中。要求`nums1`有足够的空间来存储合并后的数组,即`nums1.length &gt;= m + n`。...

    分治法-中位数

    本题利用了分治法的思想解决了两个有序数组合并后的中位数问题。通过不断地缩小问题的规模,有效地减少了计算量,提高了算法的效率。这种方法不仅适用于两个数组,也可以推广到更多数组的情况,具有一定的实用价值。

    组合数学第四版答案详解

    例如,从两个不同的集合中选择一个元素的总数就是这两个集合元素个数的乘积。 3. **二项式定理**:(a + b)^n 的展开式是组合数C(n,k)的线性组合,其中C(n,k)表示从n个不同元素中不重复地选取k个元素的方法数,也...

    12排序(下):如何用快排思想在O(n)内查找第K大元素?.pdf

    在归并排序的递推公式中,merge_sort(p…r) 表示对下标从p到r的数组进行排序,分解为两个子问题merge_sort(p…q)和merge_sort(q+1…r),然后将两个有序子数组合并成一个有序数组。递归终止条件是当p&gt;=r,即没有元素...

    组合数学( richard)第五版2到8章英文答案

    2. **计数原理**:第二章通常会介绍基本的计数原则,包括加法原理(两个事件A或B至少发生一个的方式数等于各自发生的方式数之和)和乘法原理(两个独立事件A和B同时发生的方式数等于各自发生的方式数的乘积)。...

    cpp代码-(数组)将两个升序数组合并为一个升序数组

    总结来说,合并两个升序数组的关键在于比较并选择较大的元素,确保合并后的新数组仍然有序。C++通过迭代器和指针提供了高效的方式来实现这个操作。这个过程不仅在数组操作中常见,也是许多排序算法的基础部分,比如...

    浅谈JAVA实现选择排序,插入排序,冒泡排序,以及两个有序数组的合并

    JAVA实现选择排序、插入排序、冒泡排序和两个有序数组的合并 在本文中,我们将讨论JAVA实现选择排序、插入排序、冒泡排序和两个有序数组的合并。这些排序算法都是基本的排序算法,每种算法都有其特点和应用场景。 ...

    组合数学引论部分课后习题答案

    二项式定理描述了任何两个变量的幂次展开形式,与组合数紧密相关。习题可能要求学生证明二项式定理或者应用定理解决问题。 第4章可能讨论了容斥原理,它是解决有限集合中元素计数问题的重要方法。容斥原理可以用来...

    组合数学第二版(许胤龙)课件第三章

    第三章通常是介绍排列与组合,这两个主题是组合数学中最基本和最重要的内容。在这里,我们把知识点进行详细说明: 1. 排列的概念:在组合数学中,排列是指从n个不同元素中取出m(m≤n)个元素进行有序排列的所有...

    卢开澄版组合数学课后习题答案

    ,表示从n个不同元素中选取k个并考虑顺序的方法数。 3. **二项式定理**:(a+b)^n = Σ(C(n,k) * a^(n-k) * b^k),其中k从0到n,二项式定理是组合数的重要应用,用于展开多项式的幂。 4. **鸽巢原理**(也称抽屉...

    组合数学答案(卢海澄)

    5. **斯特林数**:分为第一类和第二类斯特林数,它们分别描述了将n个元素分成k个非空循环和k个非空集合的不同方法数。 6. **鸽巢原理**:又称狄利克雷原理,是组合证明中的基础工具,它指出如果多于鸽巢数量的鸽子...

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

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

    组合数学第一张的ppt

    例如,同样从集合{a, b, c}中选择两个元素,组合包括(ab, ac, bc)三种可能,总数为组合公式C(n, k) = n!/k!(n-k)!,其中n是元素总数,k是要选择的元素数量。 加法法则和乘法法则是组合计数中的基本工具。加法法则是...

    西安电子科技大学版组合数学习题答案

    3. **帕斯卡定律**:二项式系数的递推关系也是帕斯卡定律,它指出任取两个正整数m和k,有C(m, k) = C(m-1, k-1) + C(m-1, k)。这个定律可以用于快速计算大数值的二项式系数。 4. **鸽巢原理**:这是组合数学中的...

    数据结构实验报告.doc

    线性表的合并涉及将两个或多个已排序的线性表组合成一个新的线性表,保持排序顺序。 在本实验中,学生需要熟练应用这些操作来实现一元n次多项式的加法。多项式可以用线性表表示,每个节点代表一个项,其中数据部分...

    模拟试卷9-算法附加题1

    题目3:合并两个有序数组 问题要求将两个递增有序的子数组合并成一个递增有序的数组。这里可以使用双指针方法: 1. 初始化两个指针分别指向两个子数组的起始位置。 2. 比较两个指针所指元素,选择较小的元素放入...

    组合数学试题1

    例如,斐波那契数列就是一个典型的例子,每个数都是前两个数的和。 5. **组合恒等式**:组合数学中有很多重要的恒等式,比如卡特兰数、帕斯卡定律(组合数的边界性质C(n, 0) = C(n, n) = 1, 以及C(n, k) = C(n-1, k...

Global site tag (gtag.js) - Google Analytics