找数组中第K大的数 请教

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了找数组中第K大的数 请教相关的知识,希望对你有一定的参考价值。

老师PPT上给了一种思想 说不上是具体算法 但是看不太懂 理解不了 请达人解释一下 工作原理是什么?

read the first k elements into an array and sort them in decreasing order,
(2) each remaining element is read one by one,
(2.1) If it is smaller than the kth element in the array, it is ignored;
(2.2) Otherwise, it is placed in its correct spot in the array, bumping one element out of the array.
(3) the element in the kth position is returned as the answer
请各位看好哈 我问的时老师的这种思想是怎么实现的 先排序再输出我也会 鄙人也看过算法导论 冒泡 堆排 快排变形等等来解决这个问题是绰绰有余的 我只是想知道老师这个事怎么实现的 是我翻译的问题还是怎么回事 我感觉他这个不对呢?

可以考虑冒泡算法,就是先把数组里面的数值按照大小现行排列,之后输出第k-1个就行 参考技术A 12312

找轮转后的有序数组中第K小的数

我们可以通过二分查找法,在log(n)的时间内找到最小数的在数组中的位置,然后通过偏移来快速定位任意第K个数。
此处假设数组中没有相同的数,原排列顺序是递增排列。
在轮转后的有序数组中查找最小数的算法如下:

int findIndexOfMin(int num[],int n) {
        int l = 0;
        int r = n-1;
        while(l <= r) {
            int mid = l + (r - l) / 2;
            if (num[mid] > num[r]) {
                l = mid + 1;
            } else {
                r = mid - 1;
            }
        }
        return l;
    }

接着基于此结果进行偏移,再基于数组长度对偏移后的值取模,就可以找到第K个数在数组中的位置了:

int findKthElement(int num[], int m, int k)
{
    if (k > m) return -1;
    int base = findIndexOfMin(num, 0, m-1);
    int index = (base+k-1) % m;
    return index;
}

以上是关于找数组中第K大的数 请教的主要内容,如果未能解决你的问题,请参考以下文章

无序数组中第Kth大的数

数组中第 K 大的数(leetcode 215)

数组中第 K 大的数(leetcode 215)

查找无序数组中第K大的数

滴滴笔试1.连续数组的最大和 2.找出数组中第K大的数

求数组中第k大的数(分治法)