挑战面试编程:查找数组中第k大的数
来源:互联网 发布:屏幕截图软件下载 编辑:程序博客网 时间:2024/06/04 18:06
查找数组中第k大的数
问题:
查找出一给定数组中第k大的数。例如[3,2,7,1,8,9,6,5,4],第1大的数是9,第2大的数是8……
思路:
1. 直接从大到小排序,排好序后,第k大的数就是arr[k-1]。
2. 只需找到第k大的数,不必把所有的数排好序。我们借助快速排序中partition过程,一般情况下,在把所有数都排好序前,就可以找到第k大的数。我们依据的逻辑是,经过一次partition后,数组被pivot分成左右两部分:S左、S右。当S左的元素个数|S左|等于k-1时,pivot即是所找的数;当|S左|小于k-1,所找的数位于S右中;当|S左|>k-1,所找的数位于S左中。显然,后两种情况都会使搜索空间缩小。
代码:
int Partition(int *arr, int from, int to){ int i, j; i = j = from; while (j <= to) { if (arr[j] >= arr[to]) { int tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; i++; } j++; } return i - 1;}int quickSelect(int *s, int k, int left, int right){ if (left == right) return s[left]; int i; i = Partition(s, left, right); if (i - left + 1 == k) { return s[i]; } else if (i - left + 1 < k) { return quickSelect(s, k - (i - left + 1), i + 1, right); } else return quickSelect(s, k, left, i - 1);}int findKthLargest(int* nums, int numsSize, int k) { return quickSelect(nums, k, 0, numsSize - 1);}
至于”查找数组中第k小的数“,那自然可以举一反三,同样处理了。
代码下载:查找数组中第k大的数
所有内容的目录
- CCPP Blog目录
2 0
- 挑战面试编程:查找数组中第k大的数
- 挑战面试编程:查找数组中第k大的数
- 查找数组中第K大的数
- 数组中第k大的数
- 数组中第K大的数
- 数组中第K大的数
- 查找N个数中第K大的数
- 查找N个数中第K大的数
- 查找一个数组中第k小的数
- 查找数组中第K大元素
- 查找数组中第K大的值
- 查找第k大的数
- 求数组中第k大的数的位置
- 求一个数组中前K大的数或者第K大的数
- 数组相加中第k大的数
- 求数组中第k大的数
- 找数组中第k大的数
- 两个有序数组中,寻找第K大的数
- 解决UITableViewStylePlain方式headerView顶端 滞留的代码
- CF Good Bye 2015 F. New Year and Cleaning(思维)
- Android-Universal-Image-Loader是一个开源的UI组件程序
- 自定义PopupWindow实现Spinner
- Android 开发中,有哪些坑需要注意?
- 挑战面试编程:查找数组中第k大的数
- table表格锁定任意数量列或行
- Azure Storm入门(二)—— 事务处理
- eclipse 中设置content assist 如何设置空格不上屏
- GSM模块--SIM900A短信功能
- 将数据库中的用户名和密码显示到JSP页面
- mysql------常用命令
- 菜鸟学python(2) 常见运算符
- Cocos2D瓦块地图高清屏(retina)显示比例问题的解决