题解 | #寻找第K大#

寻找第K大

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

  • 找出整数数组中第K大的数,同时还必须使用快速排序的思路,要求:时间复杂度 O(nlogn),空间复杂度 O(1)。快速排序的平均时间复杂度可以达到 O(nlogn),但是由于快速排序中存在着递归调用,所以其空间复杂度是 O(logn),此题并没有要求对整个数组进行排序,所以其平均空间复杂度仍然可以达到 O(1)。
  • 注意:对数组进行升序排列后,第1大的元素,其索引值是 n-1,第2大的元素,索引值是 n-2,以此类推,第K大的元素,索引值是 n-K
  • 算法思想:使用快速排序对数组进行升序排列(每次都选用待排部分的第一个元素作为枢轴值),在每一趟快排结束后,由于枢轴值已经被放置到了其应在的位置上,故通过判断枢轴值的索引是否是第K大的元素的索引(n-K):①如果枢轴值的索引等于 n-K,那么当前的枢轴值就是第 K 大的元素,直接返回即可;②如果枢轴值的索引大于 n-K,而枢轴值左边的元素都比枢轴值小,那么第 K 大的元素必然在枢轴值的左边,因此采用递归调用的方式对枢轴值左边的部分数组进行快排,枢轴值右边的部分可以直接忽略掉;③如果枢轴值的索引小于 n-K,那么第K大的元素必然在枢轴值的右边,直接对枢轴值右边的部分数组进行快排,而左边的部分可以直接忽略掉。
  • 代码如下
import java.util.*;

public class Solution {
    public int findKth(int[] a, int n, int K) {
        // 快速排序,要求时间复杂度 O(nlogn),空间复杂度 O(1)
        // 向findKth的重载方法中传入第K大元素的索引n-K
        return findKth(a,0,n-1,n-K);
    }
    public int findKth(int[] a,int low,int high,int KIndex){
        
        int pivot = a[low];      //取待排部分的第一个元素为枢轴值
        int i = low;
        int j = high;
        //一趟快速排序
        while (i < j) {
            while (a[j] >= pivot && i < j) {
                j--;
            }
            while (a[i] <= pivot && i < j) {
                i++;
            }
            if (i < j) {
                int temp = a[j];
                a[j] = a[i];
                a[i] = temp;
            }
        }
        a[low] = a[j];
        a[j] = pivot;
        
        if (j == KIndex) {
            return a[j];
        }else if (j > KIndex){
            return findKth(a,low,j-1,KIndex);
        }else {
            return findKth(a,j+1,high,KIndex);
        }
    }
}
全部评论
为啥这么慢...都
点赞 回复 分享
发布于 2022-04-16 02:38

相关推荐

03-27 16:40
已编辑
门头沟学院 C++
26学院本太难了,很多公司机筛就给我刷了。机会都难拿到如果是简历存在问题也欢迎拷打————————————————————分割线——————————————————————2026.3.4更新:发完贴之后,时不时投递又收到了不少的笔试/面试邀请。主要是之前投递简历出去之后基本上都是沉默状态,年后好转了不少timeline:2026.01.21&nbsp;文远知行笔试,半年多没刷算法题&nbsp;-&gt;挂&nbsp;(后续HR说春招可以重新安排笔试)2026.2.4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;小鹏汇天&nbsp;技术一面,第二周收到结果&nbsp;-&gt;挂2026.2.12&nbsp;&nbsp;&nbsp;大众Cariad代招&nbsp;技术二面&nbsp;-&gt;Offer2026.2.28&nbsp;&nbsp;&nbsp;多益网络技术面试,由于风评太差,一直在犹豫要不要接面试&nbsp;-&gt;推迟-----------分割线-----------2026.3&nbsp;月前的某一天,临时去电网报名了二批计算机岗位的笔试2026.3.6&nbsp;从上家公司实习离职,氛围最好的一家公司,leader&nbsp;说可以帮忙转正,但是流程太长,而且我们部门据说只有一个&nbsp;hc,更想要研究生,我很有可能是会被签外包公司在这里干活,就离职了。2026.3.9&nbsp;入职新公司,大众Cariad&nbsp;以外部公司的身份进组,项目组签了三年,后续三年应该都可以在这里呆,不知道有没有希望原地跳槽。2026.3.10&nbsp;电网考试居然说我通过资格审查了,短信约我去参加资格审查,请假一天,买了&nbsp;12&nbsp;号晚上的机票回成都2026.3.15&nbsp;参加国家电网计算机类笔试2026.3.17&nbsp;电网出成绩了,感觉很低。觉得已经🈚️了2026.3.18&nbsp;收到电网面试通知,通知&nbsp;3.22-3.25&nbsp;这个时间去面试,我的岗位只招&nbsp;1&nbsp;个人。据说面试只有&nbsp;2-3&nbsp;人,不知道能不能成功----------分割线-----------2026.3.21&nbsp;电网面试结束,感觉回答的还勉勉强强,大概是2个岗位分别招1个人,一共11人面试,实际来了9人2026.3.27&nbsp;出面试成绩,满分100分,早上10:20左右发现面试成绩46,我震惊了,没截图,后面过了十分钟重新看发现面试成绩给我改成58了。但同样震惊。朋友问我是不是把面试官打了,哈哈
点赞 评论 收藏
分享
03-12 12:33
嘉应学院 Python
点赞 评论 收藏
分享
评论
4
收藏
分享

创作者周榜

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