• 简谈” Top K“


    Top K

    快速选择和堆排序都可以求解 Kth Element 和 TopK Elements 问题。
    题见215. Kth Largest Element in an Array (Medium)

    partition划分法

    public int findKthLargest(int[] nums, int k) {
        int j = -1;
        int left = 0,right = nums.length - 1;
        int target = right - k + 1;
        while (j != target){
            j = partition(nums,left,right);
            if(j == target)
                return nums[j];
            else if(j < target){
                left = j + 1;
            }
            else {
                right = j - 1;
            }
        }
        return nums[j];
    }
    //leetcode中看到的划分方法,简单易懂
    public int partition(int[] nums,int start,int end){
        int pivot  = nums[start];
        int j = start;
        for(int i = start + 1;i <= end;i++){
            if(nums[i] < pivot){
                j++;
                swap(nums,i,j);
            }
        }
        swap(nums,j,start);
        return j;
    }
    //经典快排划分方法,见《算法》和cyc2018
    public int partition_custom(int[] nums,int start,int end){
        int left = start,right = end + 1;
        int pivot = nums[start];
        while (true){
            while (left < end && nums[++left] <= pivot);
            while (right > start && nums[--right] >= pivot);//right永远不会超出范围
            if(left >= right)
                break;
            swap(nums,left,right);
        }
        swap(nums,right,start);
        return right;
    }
    
    private void swap(int[] nums, int index1, int index2){
        int temp = nums[index1];
        nums[index1] = nums[index2];
        nums[index2] = temp;
    }
    

    堆排序

    public int findKthLargest_heap(int[] nums, int k) {
        PriorityQueue<Integer> heap = new PriorityQueue<>();
        for(int i = 0;i < nums.length;i++){
            heap.offer(nums[i]);
        }
        for (int i = 0;i < nums.length - k;i++){
            heap.poll();
        }
        return heap.peek();
    }
    
  • 相关阅读:
    什么是被 GC Roots 直接引用的对象?
    什么情况下JVM内存中的一个对象会被垃圾回收?
    图解GC流程
    图解JVM内存区域划分
    图解JVM类加载机制和双亲委派模型
    Nginx 是怎么工作的?
    ThreadLocal 线程本地存储
    centos7 配置阿里镜像
    C# 类库项目 无法创建 “资源字典” 文件
    linux 启动jar包 指定yml配置文件和输入日志文件
  • 原文地址:https://www.cnblogs.com/wunsiang/p/12718071.html
Copyright © 2020-2023  润新知