TopK

这道题可以有很多延伸:(1)简单的TopK算法 (2)大文件无法一次加载进内存如何找出TopK数字 (3)大文件找出频率次数最高的K个数字 (4)系统设计:Top-K Hitter找出一定时段内点击量最高的视频、博文

1)简单的TopK算法

优先队列实现

下列代码实现找出最小的前k个数,PriorityQueue实现的是堆,只有顶部是最大或者最小的元素

class Solution {
    public int[] getLeastNumbers(int[] arr, int k) {
        int[] ans = new int[k];

        PriorityQueue<Integer> queue = new PriorityQueue<>((o1,o2)-> o2-o1);

        for(int i = 0; i < k; i++){
            queue.offer(arr[i]);
        }

        for(int i = k; i < arr.length; i++){
            // queue.offer(arr[i]);
            // queue.poll();

            if(queue.peek()>arr[i]){
                queue.poll();
                queue.offer(arr[i]);
            }
        }

        for(int i=0; i<k; i++){
            ans[i] = queue.poll();
        }
        return ans;
    }
}

快速排序实现

class Solution {
    public int[] getLeastNumbers(int[] arr, int k) {
        if (k >= arr.length) return arr;
        return quickSort(arr, k, 0, arr.length - 1);
    }
    private int[] quickSort(int[] arr, int k, int l, int r) {
        int i = l, j = r;
        while (i < j) {
            while (i < j && arr[j] >= arr[l]) j--;
            while (i < j && arr[i] <= arr[l]) i++;
            swap(arr, i, j);
        }
        swap(arr, i, l);
        if (i > k) return quickSort(arr, k, l, i - 1);
        if (i < k) return quickSort(arr, k, i + 1, r);
        return Arrays.copyOf(arr, k);
    }
    private void swap(int[] arr, int i, int j) {
        int tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
    }
}

参考:
链接:https://leetcode.cn/problems/zui-xiao-de-kge-shu-lcof/solutions/1/jian-zhi-offer-40-zui-xiao-de-k-ge-shu-j-9yze/
来源:力扣(LeetCode)

(4)系统设计:Top-K Hitter找出一定时段内点击量最高的视频、博文

作者:静默虚空
欢迎任何形式的转载,但请务必注明出处。
限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。

posted @   Chenyi_li  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示