美文网首页LeetCode
004-在两个有序数组中寻找第k大元素

004-在两个有序数组中寻找第k大元素

作者: Woodlouse | 来源:发表于2020-05-09 22:03 被阅读0次

描述

给定已经排序的两个数组,找到这两个数组中所有元素的第k大的数字。

分析及实现

最直观的方法是把两个数组合并为一个有序数组,然后返回第k大的数字,这种方法的时间、空间复杂度都是O(m+n)

我们需要的是第k大的数字,不需要进行合并这么复杂的操作,可以使用两个游标分别指向两个数组,每次取两个游标里比较小的值,直到取到第k次,即可获取到第k大数字。此种操作方式的时间复杂度为O(m+n),空间复杂度为O(1)

有没有更好的方法呢?在有序数组中查找不使用二分查找总是遗憾的。在一个有序数组中查找元素是获取数组的中间元素,然后和目标值进行比较,现在在两个有序数组中查找的关键问题是如何使用二分查找呢?

假设数组A和数组B的元素个数都大于k/2,我们将A的第k/2个和B的第k/2个元素进行比较,有三种情况:

1,A[k/2-1] == B[k/2-1];

2,A[k/2-1] > B[k/2-1];

3,A[k/2-1] < B[k/2-1];

对于第1种情况,已经找到第k个元素了,返回A[k/2-1]或者B[k/2-1]即可;

对于第2种情况,B[0] ~ B[k/2-1]一定在第k个元素前面,可以在下次查找时排除掉;

对于第3种情况,A[0] ~ A[k/2-1]一定在第k个元素前面,可以在下次查找时排除掉;

因此,我们可以用递归实现,递归的终止处理:

  • A或B为空时,返回B[k-1]或者A[k-1];
  • k == 1时,返回min(A[0], B[0]);
  • 当A[k/2-1] == B[k/2-1]时,返回二者之一即可;

代码实现如下:

int findTheKthElementInTwoSortedArray01(int A[], int m, int B[], int n, int kth)
{
    if (kth > (m+n)) {
        return -1;
    }
    if(m > n) {
        return findTheKthElementInTwoSortedArray01(B, n, A, m, kth);
    }
    if (kth == 1) {
        return std::min(A[0], B[0]);
    }
    if (m == 0) {
        return B[kth-1];
    }
    
    //分割k
    int ia = std::min(kth/2, m);
    int ib = kth - ia;
    
    if (A[ia-1] < B[ib-1]) {
        return findTheKthElementInTwoSortedArray01(A+ia, m-ia, B, n, kth-ia);
    }
    if (A[ia-1] > B[ib-1]) {
        return findTheKthElementInTwoSortedArray01(A, m, B+ib, n-ib, kth-ib);
    }
    
    return A[ia-1];
}

代码在这儿

相关文章

  • 004-在两个有序数组中寻找第k大元素

    描述 给定已经排序的两个数组,找到这两个数组中所有元素的第k大的数字。 分析及实现 最直观的方法是把两个数组合并为...

  • 4. Median of Two Sorted Arrays

    两个有序数组的中位数,相当于寻找两个数组第k大的值,利用二分法进行查找,确定之后改变k的值与起始索引。 合并两个有...

  • 算法分析 [最大/小值] 2019-02-28

    1. 数组,查找第k大值 215. 数组中的第K个最大元素(元素不重复无序) Kth Largest Elemen...

  • 寻找数组中第K大的元素

    问题 tag: Medium 分析 这题最简单的做法是将数组排序,然后直接返回第K大的元素。复杂度为:O(Nlog...

  • leetcode-0004

    题目: 4. 寻找两个有序数组的中位数 关键词:排序 折半查找 思路: 查找第k个数,每次查找二个数组的第k/2位...

  • LeetCode-215-数组中的第K个最大元素

    数组中的第K个最大元素 题目描述:给定整数数组 nums 和整数 k,请返回数组中第 **k** 个最大的元素。请...

  • 二叉搜索树中第K小的元素+整数反转

    230. 二叉搜索树中第K小的元素 思路 将二叉树存为数组,通过前序遍历存为从小到大的有序数组2.需要第几大的元素...

  • 解决TopK

    前言 TopK问题有以下几种常见形式 数组中的第K个最大元素动态添加的数组中的第K个最大元素数组中前k个最大的元素...

  • QuickSort的好哥们QuickSelect

    第k大元素 在数组中找到第k大的元素。 样例 给出数组 [9,3,2,4,8],第三大的元素是 4 给出数组 [1...

  • 快速排序

    在数组中找到第k大的元素

网友评论

    本文标题:004-在两个有序数组中寻找第k大元素

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