牛客题霸NC88题解

寻找第K大

https://www.nowcoder.com/practice/e016ad9b7f0b45048c58a9f27ba618bf?tpId=117&&tqId=35010&rp=1&ru=/ta/job-code-high&qru=/ta/job-code-high/question-ranking

寻找第K大

牛客题霸NC88

难度:Medium

题目描述

有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数。

给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在。

示例1

输入

[1,3,5,2,2],5,3

返回值

2

题目解答

利用快排思想

通过快速排序的partion与二分思想找到第K大的数,代码如下:

import java.util.*;

public class Finder {
    public int findKth(int[] a, int n, int K) {
        // write code here

        int low = 0, high = n-1;
        K = n - K;

        int index = findKthCore(a, low, high, K);
        return a[index];

    }

    public int findKthCore(int[] a, int low, int high, int K){

        int mid = partion(a, low, high);

        if(mid - low == K){
            return mid;
        }
        if(mid - low > K){
            return findKthCore(a, low, mid-1, K);
        }
        else{
            return findKthCore(a, mid+1, high, K - (mid - low + 1));
        }

    }

    public int partion(int[] a, int low, int high){

        while(low < high){
            while(low < high && a[high] >= a[low]){
                high--;
            }
            swap(a, low, high);
            while(low < high && a[low] <= a[high]){
                low++;
            }
            swap(a, low, high);
        }

        return low;

    }

    public void swap(int[] a, int i, int j){

        int temp = a[i];
        a[i] = a[j];
        a[j] = temp;
    }
}

时间复杂度: O(nlogn)

空间复杂度:O(1)

通过堆实现

使用一个大小为K的小顶堆,将数组中的所有元素依次加入堆中,最终堆顶元素就是第K大的数。

import java.util.*;

public class Finder {
    public int findKth(int[] a, int n, int K) {
        // write code here

        // 小顶堆
        PriorityQueue<Integer> priorityQueue = new PriorityQueue<>();

        for(int m : a){
            // 堆元素数量不够K个或者待入堆元素比堆顶元素大
            if(priorityQueue.size() < K || priorityQueue.peek() <= m){
                priorityQueue.offer(m);
            }
            // 保持堆大小为K
            if(priorityQueue.size() > K){
                priorityQueue.poll();
            }
        }

        return priorityQueue.peek();

    }
}

时间复杂度: O(nlogK)

空间复杂度:O(K)

全部评论

相关推荐

面试官全程关摄像头1.自我介绍一下2.React和Vue哪个更熟悉一点3.你在之前那段实习经历中有没有什么技术性的突破(我只是实习了44天工作28天,我把我能说的都说了)4.你封装的哪个表单组件支不支持动态传值5.自己在实习阶段Vue3项目封装过hook吗6.hook有什么作用7.Vue2和Vue3的响应式区别(我说一个是proxy是拦截所有的底层操作,Object.defineProperty本身就是一个底层操作,有些东西拦截不了,比如数组的一些操作还有等等,面试官就说实在要拦截能不能拦截????我心想肯定不行呀,他的底层机制就不允许吧)8.pinia和vuex的区别(这个回答不出来是我太久没用了)9.pinia和zustand的区别,怎么选(直接给我干懵了)(我说react能用pinia吗&nbsp;&nbsp;他说要用的话也可以)10.渲染一万条数据,怎么解决页面卡顿问题(我说分页、监听滚轮动态加载,纯数据展示好像还可以用canvas画)(估计是没说虚拟表单,感觉不满意)11.type和interface的区别12.ts的泛型有哪些作用(我就说了一个结构相同但是类型不同的时候可以用,比如请求响应的接口,每次的data不同,这里能用一个泛型,他问我还有什么)13.你项目用的是React,如果让你再写一遍你会选择什么14.pnpm、npm、yarn的区别15.dependencies和devdependencies的区别总而言之太久没面试了,上一段实习的面试js问了很多。结果这次js一点没问,网络方面也没考,表现得很一般,但是知道自己的问题了&nbsp;&nbsp;好好准备,等待明天的影石360和周四的腾讯了&nbsp;&nbsp;加油!!!
解zj:大三的第一段面试居然是这样的结局
查看15道真题和解析
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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