经典算法学习——最小的k个数
来源:互联网 发布:软件怎么添加信任 编辑:程序博客网 时间:2024/05/01 20:10
经常面试的同学可能会遇到这个问题,即输出数组中的最小的k个数。同样的,这也是剑指Offer上面的一道题。这道题最简单的思路莫过于把输入的n个整数排序,排序之后位于最前面的k个数就是最小的k个数。这样实现的复杂度为O(nlogn)。如果大家看了上一篇博客《经典算法学习——数组中出现次数超过一半的数字》后,其实会发现两道题的思路是一样的,也就是要找到一个index值,它的前面都比它小,后面的都比它大。目的是怎样来找到这个合适的index值。当然根据前面的题目要求,输出的k个值可以是不排序的。代码上传至 https://github.com/chenyufeng1991/LeastKNumber.git 。
实现如下:
// 数组中最小的k个数#include <stdio.h>#include <stdlib.h>void LeastKNumber(int *arr, int start, int end, int k);int Partition(int *arr, int start, int end);int main(int argc, const char * argv[]){ int array[] = {5, 3, 7, 1, 0, 9}; LeastKNumber(array, 0, 5, 5); return 0;}void LeastKNumber(int *arr, int start, int end, int k){ int index = Partition(arr, start, end); while (index != k) { if (index > k) { index = Partition(arr, start, index - 1); } else { // index < k index = Partition(arr, index + 1, end); } } if (index == k) { for (int i = 0; i < k; i++) { printf("%d ",arr[i]); } return; }}int Partition(int *arr, int start, int end){ int i = start, j = end, x = arr[start]; while (i < j) { while (i < j && arr[j] >= x) { j--; } if (i < j) { arr[i++] = arr[j]; } while (i < j && arr[i] < x) { i++; } if (i < j) { arr[j--] = arr[i]; } } arr[i] = x; return i;}
1 0
- 经典算法学习——最小的k个数
- 算法学习(一):寻找最小的k个数
- 寻找最小的K个数—yuan
- 剑指offer—最小的K个数
- 剑指offer — 最小的k个数
- 算法---寻找最小的k个数
- 最小的K个数(算法)
- bfprt算法求最小的k个数
- 算法考题---最小的k个数
- 算法题/最小的k个数
- n个数中的最小的k个数的BFPRT算法
- 最小的K个数
- 最小的K个数
- 最小的K个数
- 最小的k个数
- 最小的k个数
- 最小的k个数
- 最小的k个数
- 【设计模式】## 3、装饰者模式 ##
- JavaSE Map
- 详解Hadoop中的LineReader的readLine函数
- OSGI环境搭建-使用JETTY-9.X创建WEB应用-Jetty性能调优
- IT项目管理基础
- 经典算法学习——最小的k个数
- JAVA读取RTF文档
- 深度学习Caffe平台安装——Ubuntu安装CPU模式的caffe
- 数据库中触发器before与after认识
- iOS常用UI控件属性及简单动画
- javascript中的options.add() options.remove() options(index)或options.item(index)
- 图解Linux命令之--whereis命令
- NYOJ-106 背包问题
- iOS OpenGL GLKView GLKit 详解