剑指offer的最小k个数
来源:互联网 发布:广东飞鱼网络 编辑:程序博客网 时间:2024/06/05 18:02
题目描述
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,
链接:
https://www.nowcoder.com/practice/6a296eb82cf844ca8539b57c23e6e9bf?tpId=13&tqId=11182&tPage=2&rp=2&ru=%2Fta%2Fcoding-interviews&qru=%2Fta%2Fcoding-interviews%2Fquestion-ranking
第一种方法(排序):
思路:刚看到这题,第一想法就是sort排序,时间复杂度为NlogN,然后将前k个数存储进去,写了下居然通过了,没超时。。
代码很简单:
class
Solution {
public
:
vector<
int
> GetLeastNumbers_Solution(vector<
int
> input,
int
k) {
vector<
int
> v;
if
(k>input.size())
return
v;
sort(input.begin(),input.end());
for
(
int
i=
0
;i<k;i++)
v.push_back(input[i]);
return
v;
}
}
思路:先将前k个数按照heap_sort(heap_sort就不介绍了,课自行百度)排好,然后(前k个中最大的数)第一个数和第k+1个数比较,如果第一个数比第k+1个大,交换两个数的位置,然后heap_sort继续将k个数中最大数放到第一个位置,继续和第k+1个数比较,如果第一个数不大于第k+1个数,则与第k+2个比较,知道容器最后一个数,结束。
AC代码:
class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
vector<int>res;
if(k>input.size()||input.empty())return res;
for(int i=input.size()/2;i>=0;--i)
partial_sort(input,i,k);
int i=k;
while(i<input.size()){
if(input[i]<input[0]){
int tmp=input[0];
input[0]=input[i];
input[i]=tmp;
partial_sort(input,0,k);
i=k;
}else i++;
}
for(int i=0;i<k;++i)
res.push_back(input[i]);
return res;
}
void partial_sort(vector<int>&input,int i,int len){
int child=2*i+1;
if(child<len){
if(child+1<len&&input[child+1]>input[child])
child+=1;
if(input[child]>input[i]){
int tmp=input[child];
input[child]=input[i];
input[i]=tmp;
partial_sort(input,child,len);
}
}
}
};
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
vector<int>res;
if(k>input.size()||input.empty())return res;
for(int i=input.size()/2;i>=0;--i)
partial_sort(input,i,k);
int i=k;
while(i<input.size()){
if(input[i]<input[0]){
int tmp=input[0];
input[0]=input[i];
input[i]=tmp;
partial_sort(input,0,k);
i=k;
}else i++;
}
for(int i=0;i<k;++i)
res.push_back(input[i]);
return res;
}
void partial_sort(vector<int>&input,int i,int len){
int child=2*i+1;
if(child<len){
if(child+1<len&&input[child+1]>input[child])
child+=1;
if(input[child]>input[i]){
int tmp=input[child];
input[child]=input[i];
input[i]=tmp;
partial_sort(input,child,len);
}
}
}
};
阅读全文
1 0
- 剑指offer:最小的k个数
- 【剑指offer】最小的k个数
- 剑指offer-30:最小的k个数
- 最小的k个数(剑指offer)
- 剑指offer--最小的K个数
- 剑指Offer之 - 最小的k个数
- 剑指offer-30 最小的K个数
- 剑指offer之最小的k个数
- 剑指offer 30 - 最小的k个数
- 《剑指offer》最小的K个数
- 【剑指Offer】最小的K个数
- 剑指offer—最小的K个数
- 剑指Offer-30-最小的k个数
- 剑指offer:最小的K个数
- 【剑指offer】之最小的k个数
- [剑指offer:30]最小的k个数
- 剑指offer 29 最小的k个数
- 剑指offer 最小的K个数
- Cmake相同源码,编a库OK,编so库提示各种未定义的引用
- React 单向数据流
- Bomb HDU5934
- 析构函数多态的问题
- 微信端iphone 使用video标签播放不了视频
- 剑指offer的最小k个数
- Jquery+HTML5+PHP实现前台压缩图片并上传
- Trafodion Troubleshooting-Certificate file error
- python 赋值问题
- 传统创投机构的模式升级:联合创业模式就这样兴起!
- Android WebView与 JS 的交互方式
- plupload学习笔记
- MongoDB导入导出
- 论文阅读:《Human Parsing with Contextualized Convolutional Neural Network》ICCV 2015