【算法】寻找第K大

【算法】寻找第K大

https://www.nowcoder.com/questionTerminal/e016ad9b7f0b45048c58a9f27ba618bf


1.题目

  • 这道题最需注意的就是:找第K大的数,而不是第K小的数

2.我的解法

  • 代码

    import java.util.*;
    
    /*
    快速排序,得出第K大的数
    注意是第K大,不是第K小
     */
    public class Solution {
    
        public static int findKth(int[] a, int n, int K) {
            quickSort(a, 0, n-1);
    
            return a[n-K];
        }
    
        public static void quickSort(int[] a, int begin, int end) {
            if (begin >= 0 && begin < a.length && end >= 0 && end < a.length && begin < end) {
                int i = begin,j = end;
                int axis = a[i];//中轴
    
                while (i != j) {
                    while (i < j && axis < a[j])
                        j--;
                    if (i < j)
                        a[i++] = a[j];
    
                    while (i < j && axis > a[i])
                        i++;
                    if (i < j)
                        a[j--] = a[i];
    
                }
    
                a[i] = axis; //i==j
                quickSort(a, begin, i - 1);
                quickSort(a, i + 1, end);
            }
        }
    
    }
    

不足

  • 不需要全部排序完成再找

3.推荐解法

  • 代码

    利用二分的思想查找

    import java.util.*;
    
    /*
    每一轮快速排序(从大到小)后,判断中轴等于/小于/大于,下标K-1
    若等于,说明已经找到第K大,返回值
    中轴小于K-1,只要在右半部分继续找
    中轴大于K-1,只要在左半部分继续找
    
    注意:是第K大,不是第K小
    */
    public class Solution {
    
        public static int findKth(int[] a, int n, int K) {
            return findK(a,K,0,n-1);
        }
    
        public static int findK(int[] a,int K,int begin,int end) {
            if(begin<=end){
                int index=quickSort(a, begin, end);
                if(index==K-1)
                    return a[index];
                else if(index<K-1)
                    return findK(a,K,index+1,end);
                else
                    return findK(a,K,begin,index-1);
            }
            return -1;
        }
    
        public static int quickSort(int[] a, int begin, int end) {
            int i = begin,j = end;
            int axis = a[i];//中轴
    
            while (i < j) {
                while (i < j && axis >= a[j])
                    j--;
                if (i < j)
                    a[i++] = a[j];
    
                while (i < j && axis <= a[i])
                    i++;
                if (i < j)
                    a[j--] = a[i];
    
            }
    
            a[i] = axis; //i==j
            return i;
        }
    
    }
    
posted @ 2021-03-12 18:14  musecho  阅读(96)  评论(0编辑  收藏  举报