题解 | #寻找第K大#

寻找第K大

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

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param a int整型一维数组
     * @param n int整型
     * @param K int整型
     * @return int整型
     */
    public int findKth (int[] a, int n, int K) {
        // write code here

        // 1.先进行排序 - O(NlogN)
        // 手写快排
        // Arrays.sort(a);
        quickSort(a);

        // 2.直接取出第K大元素返回
        return a[n - K];
    }

    // 快速排序主方法
    public void quickSort(int[] a) {
        if (a.length == 0 || a.length == 1) {
            return;
        }
        process(a, 0, a.length - 1);
    }

    // 快速排序递归方法
    public void process(int[] a, int l, int r) {
        // 递归出口
        if (l >= r) {
            return;
        }

        // 先分区,再根据pivort的位置左右递归
        int[] i = partition(a, l, r);
        process(a, l, i[0]);
        process(a, i[1], r);
    }

    // 快速排序分区方法
    public int[] partition (int[] a, int l, int r) {
        int p = a[l];
        int smaller = l - 1;
        int larger = r + 1;
        int i = l;
        while (i < larger) {
            if (a[i] == p) {
                // 当前值等于p,则直接掠过
                i++;
            } else if (a[i] < p) {
                // 发现当前值比p更小,则与smaller的下一个位置交换,smaller自增,表示小于区右扩一位
                // 同时i可以自增,因为从前面交换过来的元素要么等于p,要么是自己交换自己,无需再次比较
                int t = a[i];
                a[i] = a[smaller + 1];
                a[smaller + 1] = t;
                smaller++;
                i++;
            } else {
                // 发现当前值比p更大,则与larger的前一个位置交换,larger自减,表示大于区左扩一位
                // 此时i不能自增,因为从后面交换过来的元素不知道其与p的大小关系,需要再次比较
                int t = a[i];
                a[i] = a[larger - 1];
                a[larger - 1] = t;
                larger--;
            }
        }

        int[] result = {smaller, larger};
        return result;
    }
}

全部评论

相关推荐

点赞 评论 收藏
分享
爱吃肉的伊登在写日记:好棒,27届简历能做成这个样子,但是第一个项目感觉cover住难度还是不小的,特别是二面的时候肯定要对分布式系统设计这一块儿有高出正常面试者的水平才行
点赞 评论 收藏
分享
代码飞升:别用口语,后端就写后端,前端就写前端,最后别光后悔
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务