5.查找最小的k个元素[Kmin]】的更多相关文章

[题目] 输入n个整数,输出其中最小的k个. 例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4. [分析] 这道题最简单的思路莫过于把输入的n个整数排序,这样排在最前面的k个数就是最小的k个数.只是这种思路的时间复杂度为O(nlogn).我们试着寻找更快的解决思路. 我们可以先创建一个大小为k的数据容器来存储最小的k个数字.接下来我们每次从输入的n个整数中读入一个数.如果容器中已有的数字少于k个,则直接把这次读入的整数放入容器之中:如果容器中已有k个数字了,也就…
5.查找最小的 k 个元素(数组)题目:输入 n 个整数,输出其中最小的 k 个.例如输入 1,2,3,4,5,6,7 和 8 这 8 个数字,则最小的 4 个数字为 1,2,3 和 4. 算法里面学过查找第k小的元素的O(n)算法 试着实现了一下: 注意new 初始化二维数组的方式 int (* a)[5] = new int[8][5]; /* 5.查找最小的 k 个元素(数组) 题目:输入 n 个整数,输出其中最小的 k 个. 例如输入 1,2,3,4,5,6,7 和 8 这 8 个数字,…
紧接着上一篇微软编程面试100题,这次想解决的是查找最小的K个元素,题目是:输入n 个整数,输出其中最小的k 个.例如输入1,2,3,4,5,6,7 和8 这8 个数字,则最小的4 个数字为1,2,3 和4. 看到题目的时候我第一反应,这题很简单,使用任何方式的排序将数列按顺序存储,之后遍历需要的k个元素即可,于是自己动手很容易就完成了,但是后来在网络上发现很多人对这题的解决方式是用小根堆(MinHeap)或者大根堆(MaxHeap),这才意识到,其实出题人是醉翁之意不在酒,在乎复杂度的考虑也.…
查找最小的K个元素,使用最大堆,具体代码如下: #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; void swap(int *a, int *b) {     int temp;     temp = *a;     *a = *b;     *b = temp; } void heap_adjust(int *a, int i, int size) {     int lchild = 2 *…
查找最小的k个元素 题目:输入n个整数,输出其中最小的k个. 例如输入1, 2, 3, 4, 5, 6, 7和8这八个数字,则最小的4个数字为1, 2, 3和4. 分析:这道题最简单的思路是把输入的n个整数排序,这样排在最前面的k个数就是最小的k个数.只是这种思路的时间复杂度为O(nlogn),这当然还有更快的思路. 可以开辟一个长度为k的数组,每次从输入的n个整数中读入一个数,如果数组中已经插入的元素个数少于k个,则将读入的整数直接放到数组中.否则长度为k的数组已经满了,不能再往数组里插入元素…
题目: 输入n个整数,输出其中最小的k个,例如输入1,2,3,4,5,6,7,8这8个数,则最小的4个是1,2,3,4(输出不要求有序) 解: 利用快速排序的partition,算导上求第k大数的思想,求出第k大的数,然后遍历数组,如果a[i]<a[k],那么a[i]就是前k小的元素之一. 求第k大的元素时间是o(n),求前k小元素时间是o(n),所以总时间是o(n) 代码: /* 求数组最小的k个数,参考算法导论求中位数的k个临近值,首先求出第k小的数,然后o(n)遍历,若<,则是前k小的数…
题目:输入n个整数,输出其中最小的k个. 例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4. 两种思路,无非就是时间与空间的妥协. 限制空间的时候要对原数组进行排序,最好的时间复杂度是O(nlogn),由此可见,当牺牲一部分空间的时候会换来时间复杂度的降低.进而再想到利用一个大小为K的临时数组,来存储K个最小的值,在遍历原数组的同时,更新临时数组里的数据就OK了.那么,现在的问题就是更新临时数组,怎样才能每访问一个数据,都能使临时数组里的数据是最小的K个.自然想…
题目:输入n个整数,输出其中最小的k个.例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4. 分析:这道题最简单的思路莫过于把输入的n个整数排序,这样排在最前面的k个数就是最小的k个数.只是这种思路的时间复杂度为O(nlogn).我们试着寻找更快的解决思路. 我们可以先创建一个大小为k的数据容器来存储最小的k个数字.接下来我们每次从输入的n个整数中读入一个数.如果容器中已有的数字少于k个,则直接把这次读入的整数放入容器之中:如果容器中已有k个数字了,也就是容器已满…
题目要求: 输入n个整数,输出其中最小的k个. 例如:输入1,2,3,4,5,6,7,8这8个数字,则最小的4个数字为1,2,3,4. 参考资料:剑指offer第30题. 题目分析: 解法一: 用快排的思想,但是最小的k个数不用排序,时间复杂度O(n). 优点:时间复杂度好,缺点:会修改原整数数组顺序. 解法二: 创建一个大小为k的最大堆,遍历一遍数组,同时不断修改最大堆.时间复杂度O(nlogk). 优点:不会修改原数组,适用于海量数据.缺点:比解法一时间复杂度高. 其他解法: 1.快排,取前…
问题描述: 输入n 个整数,输出其中最小的k 个. 例如输入8, 7, 6, 5, 4, 3, 2, 1这8 个数字,则最小的3 个数字为3, 2, 1.   分析: 时间复杂度O(nlogn)方法: 对n个整数升序排序,取数组前面k个数就是最小的k个数,时间复杂度为O(nlogn),空间复杂度为O(1).   大顶堆,时间复杂度为O(nlogk): 我们可以采用大顶堆来保存最小的k个数,堆顶元素就是k个最小的数中最大的.新来一个元素的时候,与堆顶元素进行比较,如果比堆顶元素大,则直接丢弃.如果…