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

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

测试样例:[1,3,5,2,2],5,3
返回:2
      我的第一个思路,使用快排进行排序,排序后就可以得到第k个最大的数了。
 int quicksort(vector<int>&a,int i,int j){int k=a[i];while(i<j){while(j>i&&a[j]>=k)j--;if(i<j){a[i]=a[j];i++;}while(i<j&&a[i]<=k)i++;if(i<j){a[j]=a[i];j--;}}a[i]=k;return i;}int findKth(vector<int> a, int n, int K) {// write code hereint m=quicksort(a,0,n-1);quicksort(a,0,m-1);quicksort(a,m+1,n-1);return a[n-K];}

思路我觉得没问题,但总是得不到正确结果。而且例子给我的是49个数。没看出错误我就跟代码,第一步即刻发现我快排没排对啊。这样我就着重看快排。果然3个quicksort是什么鬼啊?应该是分治递归。这样代码改为如下即可。

 int quicksort(vector<int>&a,int i,int j){int k=a[i];while(i<j){while(j>i&&a[j]>=k)j--;if(i<j){a[i]=a[j];i++;}while(i<j&&a[i]<=k)i++;if(i<j){a[j]=a[i];j--;}}a[i]=k;return i;}void quickMerge(vector<int>&A,int l,int j){if(l<j){int m=quicksort(A,l,j);quickMerge(A,l,m-1);quickMerge(A,m+1,j);}}int findKth(vector<int> a, int n, int K) {// write code herequickMerge(a,0,n-1);return a[n-K];}

这个复杂度当然是O(nlogn),但是在分治的基础上修改代码也可以采用如下方法。

 int findKth(vector<int> a, int n, int K) {return quickfind(a, 0, n-1, K);}int quickfind(vector<int>& a, int left, int right, int k) {int i = left;int j = right;int mark = a[left];while (i < j) {while (i < j && a[j] >= mark)--j;if (i < j)a[i++] = a[j];while (i < j && a[i] <= mark)++i;if (i < j)a[j--] = a[i];}a[i] = mark;//哨兵右侧比他大的数字个数int big_num = right - i;//如果哨兵刚好是第K大的数if (k - big_num - 1 == 0)return mark;else if (k - big_num - 1 > 0) {//如果右侧数字个数不够K个,则从左侧找第k-big_num-1大的数return quickfind(a, left, i - 1, k - big_num - 1);} else {//如果右侧数字个数比K多,则在右侧找第K大的数return quickfind(a, i + 1, right, k);}}

这样的话复杂度肯定降低,因为只用递归调用一边,否则要完成排序需要调用两边。虽然浪费了很长时间,但找到了问题的关键我还是很开心的。

网易2016笔试(3)相关推荐

  1. 网易历届笔试面试题整理大全

    整理了一下网易往届笔试面试题,希望对大家有帮助: 超级有用的面试题:Java常见面试题    常见算法面试题   数据库常见面试题  操作系统常见面试题   C/C++常见面试题  大数据常见面试   ...

  2. 网易2016游戏技术岗在线编程题(二)

    题目来源:牛客网-网易2016年研发工程师编程题二. 1. 奖学金 小v今年有n门课,每门都有考试,为了拿到奖学金,小v必须让自己的平均成绩至少为avg.每门课由平时成绩和考试成绩组成,满分为r.现在 ...

  3. 网易2016游戏技术岗在线编程题(一)

    题目来源:牛客网-网易2016年研发工程师编程题. 1.小易的升级之路 小易经常沉迷于网络游戏.有一次,他在玩一个打怪升级的游戏,他的角色的初始能力值为 a.在接下来的一段时间内,他将会依次遇见n个怪 ...

  4. 网易2016研发工程师编程题--完全解析

    前言 之前做公司的真题,碰到动态规划,还有一些数学性质的题目比较多一点.网易2016研发工程师编程题跟之前做的题目有很大的不同,不仅涉及到二叉树的编码,还涉及到图的广度遍历,最后还有一个快排.可以说这 ...

  5. 网易2016研发工程师笔试题

    网易2016研发工程师笔试题 2015/12/9 11:25(网上收集整理的,参考答案在后面,若有错误请大神指出) 1. 执行指令find / -name "test.c",按ct ...

  6. 网易笔试 android,网易android笔试题目

    网易android笔试题目 网易android笔试题目(1) 1.什么是ANR,如何规避? 2.描述Activity 生命周期 3.描述android Handler 工作机制 4.android s ...

  7. 网易2016实习研发笔试

    小明陪小红去看钻石,他们从一堆钻石中随机抽取两颗并比较她们的重量.这些钻石的重量各不相同.在他们们比较了一段时间后,它们看中了两颗钻石g1和g2.现在请你根据之前比较的信息判断这两颗钻石的哪颗更重. ...

  8. 网易2016招聘笔试升级之路Java代码

    本文地址:http://blog.csdn.net/shanglianlm/article/details/72968583 小易经常沉迷于网络游戏.有一次,他在玩一个打怪升级的游戏,他的角色的初始能 ...

  9. 网易笔试编程题java_2017年网易校招笔试JAVA研发编程题

    为什么80%的码农都做不了架构师?>>> 尝试挑战了下网易2017校招的笔试编程题,共三题,AC第一题,第二题思考了很久勉强用一种low逼的方式完成,第三题没有完成,希望路过的ACM ...

最新文章

  1. Android学习笔记进阶十一图片动画播放(AnimationDrawable)
  2. Redis 击穿、穿透、雪崩产生原因以及解决思路
  3. CentOS LVM
  4. 线程安全: 互斥锁和自旋锁(10种)
  5. 【收藏】K8S部署minio对象存储
  6. mysql数据存储方式_数据存储在mysql的两种方式
  7. BIND_MISMATCH导致过多VERSION COUNT的问题
  8. linux 常用参数,Linux 常用命令及参数整理
  9. VMware发布面向未来的员工工作解决方案,满足分散办公需求
  10. vector使用中可能出现的一个陷阱
  11. 基于Pytorch的BERT-IDCNN-BILSTM-CRF中文实体识别实现
  12. eBPF for Windows开源项目
  13. 关于 SQLNET.AUTHENTICATION_SERVICES 验证方式的说明
  14. FCKeditor编辑器详解
  15. 用Ai制作立体logo
  16. gps面积测量 java_GPS面积距离测量
  17. Windows驱动程序开发 - 初识驱动
  18. 电脑接html线没反应,笔记本插上网线没反应怎么办【解决方法】
  19. 掌上生活显示服务器忙,掌上生活服务端
  20. Java计算每月工作天数

热门文章

  1. C++图书管理系统及相应文件的创建与输出
  2. Java设计模式 Design Pattern:包装模式 Decorator Pattern
  3. 电脑重新安装了有线网卡驱动,并且能上网,但网络连接图标有红叉怎么去掉
  4. KALI LINUX渗透测试学习笔记
  5. Windows、Unix、Mac不同操作系统的换行问题 回车符\r和换行符\n
  6. 计算机正朝两级方向发展即,当前计算机正朝两极方向发展,即()。A、专用机和通用机B、微型机和巨型机C、模拟机和数字机D、个人...
  7. 开源工单系统 python_运维工单--服务器申请工单
  8. 网管员必知:常用电脑密码破解(转)
  9. java微信公众号发送链接,100%好评!
  10. Python tkinter 保姆级超简易登陆界面教学