最小的k个数
来源:互联网 发布:mysql navicat 破解机 编辑:程序博客网 时间:2024/05/22 13:16
题目描述
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
两种解法
1、O(n)复杂度的算法,找到数组中第k大的数,按照快排的二分搜索的想法,首先设定一个数,把比这个数小的都放到这个数的左边,比这个数大的都放在这个数的右边。如果左边数的个数小于k,从右边继续寻找,否则从左半部分开始寻找。知道找到数字的下标为k。
2、O(nlogk)复杂度算法,适合处理海量数据,创建大小为k的容器,在k中找到最大数,可以构建一个最大堆在O(1)时间得到已有数组的最大值,O(logk)时间完成删除和插入操作。如果插入的元素比这个容器的最大值小,那么替换最大值。一直到最后,如果构建最大堆比较困难,可以使用STL现成的红黑树关联容器,如multiset。
下面的代码是解法1的代码:
class Solution {public: vector<int> GetLeastNumbers_Solution(vector<int> input, int k) { if(k>input.size()||input.size()<=0) return vector<int>{}; vector<int> res; int begin=0; int end=input.size()-1; while(begin<=end) { int temp=input[begin]; int i=begin; int j=end; while(i<j) { while(input[j]>=temp&&i<j) --j; if(i<j) input[i]=input[j]; while(input[i]<=temp&&i<j) ++i; if(i<j) input[j]=input[i]; } input[i]=temp; if(i==k-1) { int count=0; while(count<k) { res.push_back(input[count]); ++count; } return res; } else if(i<k-1) { begin=i+1; } else { end=i-1; } } return res; }};
0 0
- 最小的K个数
- 最小的K个数
- 最小的K个数
- 最小的k个数
- 最小的k个数
- 最小的k个数
- 最小的k个数
- 最小的k个数
- 最小的k个数
- 最小的K个数
- 最小的k个数
- 最小的K个数
- 最小的K个数
- 最小的K个数
- 最小的K个数
- 最小的K个数
- 最小的k个数
- 最小的k个数
- android调用系统相机拍照后对相片进行裁剪[先存,明天看]
- 个人记录-LeetCode 93. Restore IP Addresses
- 嵌入式启动顺序
- BAT面试之操作系统
- 软件重装问题
- 最小的k个数
- linux笔记
- Java源码分析之String
- CSS常见兼容性问题总结
- 正则表达式 re
- C++中按值调用中的几个比较好玩的问题
- java语言基础(18)——数组
- cpp——与c之不同——初始化
- jquery去重复 如何去除select控件重复的option