美文网首页
求出数组中第K大的数

求出数组中第K大的数

作者: Jason_Shu | 来源:发表于2019-03-21 14:29 被阅读0次

我们可以用暴力循环来求解,但是如果想把时间复杂度降到O(n),我们可以借用「快速排序」的思想,一次常规操作后,我们的基准值(pivot)会将数组分为两半,前一半是比pivot小的,后一半是比pivot大的。此时这个pivot所处的数组下标为index,那么这个pivot就是整个数组中「第index+1」小的值。同理,如果我们将比pivot大的放在pivot的前半段,把比pivot小的放在pivot的后半段,那么这个pivot其实就是第「index+1」大的值了。如果这个「index+1」刚好等于k,那么我们就可以直接返回这个pivot值,如果「index+1」大于k,说明我们要找的值在arr[0]到arr[index-1]这个前半段区间上,反之则在arr[index+1]-arr[arr.length - 1]这个后半段区间上,然后循环查找。

代码:

function findKMax(arr, k) {
    let len = arr.length;
    let index = quick(0, arr.length - 1, arr);
    while(index + 1 != k) {
        if(index + 1 > k) {
            index = quick(0, index - 1);
        } else {
            index = quick(index + 1, len -1)
        }
    }
    return arr[index];

}

// 一次常规操作,使得pivot前半段比它大,后半段比它小
function quick(start, end, arr) {
    if(start >= end) return;
    let left = start;
    let right = end - 1;
    let key = arr[end];
    while(left < right) {
        while(left < right && arr[left] > key) left++;
        while(left < right && arr[right] < key) right--;
        [arr[left], arr[right]] = [arr[right], arr[left]];
    }
    if(arr[left] <= key) {
        [arr[left], arr[end]] = [arr[end], arr[left]];
    } else {
        left++;
    }
    return left;
}

相关文章

  • 求出数组中第K大的数

    我们可以用暴力循环来求解,但是如果想把时间复杂度降到O(n),我们可以借用「快速排序」的思想,一次常规操作后,我们...

  • LeetCode 215. Kth Largest Elemen

    @(LeetCode) 问题描述 找出数组中第 k 个最大的数。注意是数组排序后第 k 大的数,而不是去重后的第 ...

  • 随机选择算法-选择第K大

    问题描述 从一个无序数组中求出第K大的数,如{5,12,7,2,9,3},第三大的数是5,第五大的数是9.一种思路...

  • Lua 快速排序

    快排 在一个数组中快速找出第K大的数

  • Leetcode.215.Kth Largest Element

    题目 给定一个数组, 输出第k大的数. 思路 进行从大到小排序, 第k-1即为第k大的数. 总结 掌握快速排序.

  • ologn排序算法后的两个问题

    求一个数组的逆序数对的个数(归并排序) 求出nums里第k小的数(快速排序)

  • 数组中第K大的数

    一、相关概念 二、题目 题目 一个未排序的数组中找第k大的数 思路 快排 代码 参考文献 数组中的第K个最大元素

  • 数组中第k大的数

    排序算法的稳定性 假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变...

  • 215. Kth Largest Element in an A

    找到未排序数组中第K大的数,使用大根堆和小根堆的区别

  • BFPRT算法:求第K小或者第K大的数

    问题: 一个数组中求第k小或者第k大的数 思路(转自http://blog.csdn.net/liuxiao214...

网友评论

      本文标题:求出数组中第K大的数

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