美文网首页
求前K个最大的数

求前K个最大的数

作者: 张虾米试错 | 来源:发表于2019-03-05 21:26 被阅读0次

本文介绍3种方法求前K个最大的数。

方法1 排序后求解

排序后求解,这种方法的复杂度是O(nlogn + k)

方法2 优先队列

使用优先队列(说实话,没太明白啥意思),但是我猜大致意思就是说用一个队列来保留当前前K个最大的值。

用堆排序的话,可以只找到前K个最大的数即可。

def findKthLargest(nums, k):
    """
    :type nums: List[int]
    :type k: int
    :rtype: int
    """
    def adjust_heap(nums, end, begin):
        root = begin
        while True:
            tmp = 2 * root + 1
            if tmp > end:
                break
            if tmp+1 <= end  and nums[tmp+1] > nums[tmp]:
                tmp = tmp + 1
            if nums[root] < nums[tmp]:
                nums[root], nums[tmp] = nums[tmp], nums[root]
                root = tmp
            else:
                break

    end = len(nums) - 1
    if end == 0:
        return nums[0]
    begin = end//2 - 1
    for i in xrange(begin, -1, -1):
        adjust_heap(nums, end, i)
    print nums
    for j in xrange(end, end-k, -1):
        nums[j], nums[0] = nums[0], nums[j]
        adjust_heap(nums, j, 0)
        print nums
    return nums[-k]

if __name__ == "__main__":
    nums = [3, 2, 1, 5, 6, 4]
    k = 2
    print findKthLargest(nums, k)

方法3 利用快排的思想

def partition(nums, left, right):
    pviot = nums[right]
    p = left
    for i in xrange(left, right):
        # 由于本题是找第K大的数,因此这里是>
        if nums[i] > pviot:
            nums[i], nums[p] = nums[p], nums[i]
            p += 1
    nums[p], nums[right] = nums[right], nums[p]
    return p

def findKthLargest2(nums, k):
    if len(nums) == 1:
        return nums[0]
    left = 0
    right = len(nums) - 1
    p = partition(nums, left, right)
    while left < right:
        if k == p + 1:
            return nums[p]
        elif k < p + 1:
            return findKthLargest2(nums[left:p], k)
        else:
            return findKthLargest2(nums[p+1:right+1], k-p-1)

def findKthLargest3(nums, k):
    if len(nums) == 1:
        return nums[0]
    size = len(nums)
    left = 0
    right = len(nums) - 1
    while left <= right:
        p = partition(nums, left, right)
        if k == p + 1
            return nums[p]
        elif k > p + 1:
            left = p + 1
        else:
            right = p - 1


if __name__ == "__main__":
    nums = [3, 2, 1, 5, 6, 4]
    k = 2
    print findKthLargest2(nums, k)

相关文章

  • 求前K个最大的数

    本文介绍3种方法求前K个最大的数。 方法1 排序后求解 排序后求解,这种方法的复杂度是O(nlogn + k) 方...

  • 堆的应用

    堆排序 100个亿数中找出最小的前k个数(海量数据 Top k 问题)-->建大堆 100个亿数中找出最大的前k个...

  • 8.13

    排序用priorityqueue有奇效,求第k个大的数,前K个大的数,mergeK个链表,用一个minheap 遍...

  • 快速排序 --- 基础实践篇

    本篇主要介绍快速排序的基本代码。 大纲 普通版的快速排序 改进版的快速排序 快速排序应用----求前K个最大的数 ...

  • Top K 问题

    问题描述 有N(N>>10000)个整数,求出其中的前K个最大的数。 问题分析 需要前K个最大数,一定会有比较的过...

  • 查找 TopK 问题

    ​从海量数字中寻找最大/小的 k 个,这类问题我们称为 TopK 问题。 通常使用数据结构-最大/小堆来解决 求前...

  • 5. topN 求前10个最大的数

    date[2018-12-20] 准备材料 生成Long类型的包装数据流 生成Int类型的非包装数据流 求前10个...

  • 左神算法笔记——BFPRT算法

    简介 通常我们需要在一大堆数中求前k大的数。比如在搜索引擎中求当天用户点击次数排名前10000的热词,在文本特征选...

  • LeetCode 子数组最大平均数 I

    给定 n 个整数,找出平均数最大且长度为 k 的连续子数组,并输出该最大平均数。 示例: 提示: 1 <= k <...

  • PriorityQueue 使用方法

    求最大k个元素的问题:使用小顶堆 求最小k个元素的问题:使用大顶堆 参考:1 采用PriorityQueue实现大...

网友评论

      本文标题:求前K个最大的数

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