剑指offer—最小的K个数
2015-10-04 12:31
357 查看
华电北风吹
天津大学认知计算与应用重点实验室
日期:2015/10/4
题目描述
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
解析:基于插入排序的思想可以想到使用一个长度为k的排序数组储存最小的k个元素,复杂度O(nk)。基于堆排序的思想可以想到对构建好的小根堆,进行k次取堆顶元素也可以达到目标,复杂度O(n+klog(n))。
天津大学认知计算与应用重点实验室
日期:2015/10/4
题目描述
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
解析:基于插入排序的思想可以想到使用一个长度为k的排序数组储存最小的k个元素,复杂度O(nk)。基于堆排序的思想可以想到对构建好的小根堆,进行k次取堆顶元素也可以达到目标,复杂度O(n+klog(n))。
class Solution { public: vector<int> GetLeastNumbers_Solution(vector<int> input, int k) { vector<int> v; if (input.size() < k) return v; int n = input.size() - 1; for (int i = (n - 1) / 2; i >= 0; i--) { HeapAdjust(input, i, n); } for (int i = 0; i<k; i++) { v.push_back(input.front()); swap(input.front(), input[n-i]); HeapAdjust(input, 0, n - i - 1); } return v; } void HeapAdjust(vector<int> &input, int k, int length) { while (2 * k + 1 <= length) { int x = k; if (input[2 * k + 1] < input[k]) x = 2 * k + 1; if ((2 * k + 2 <= length) && (input[2 * k + 2] < input[x])) x = 2 * k + 2; if (x == k) return; else { swap(input[k], input[x]); k = x; } } } void swap(int &a, int &b) { int temp = a; a = b; b = temp; } };
相关文章推荐
- Uncaught TypeError: Cannot read property 'call' of undefined jquery.validate.min.js:28
- Canvas API
- Js/Jquery获取iframe中的元素
- JavaScript总结
- 剑指offer 代码
- JSON 数据格式
- 剑指offer—数组中出现次数超过一半的数字
- [leetcode-289]Game of Life(java)
- 代码:css小图标
- html小需求——科技文章展示
- POJ 3905 Perfect Election(2-SAT)
- nodejs express hi-cms
- 推荐10 个很棒的 jQuery 特效代码
- 五个有用的jquery小技巧
- CCRenderBuffer初始化中的render state参数
- CCRenderBuffer初始化中的render state参数
- CCRenderBuffer初始化中的render state参数
- 14个实用的CSS在线实例教程
- 剑指offer—字符串的排列
- LeetCode "Game of Life"