最小的K个数(NC119/考察次数Top5/难度中等)
Posted 码农指南
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最小的K个数(NC119/考察次数Top5/难度中等)相关的知识,希望对你有一定的参考价值。
描述:
给定一个数组,找出其中最小的K个数。例如数组元素是4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。如果K>数组的长度,那么返回一个空的数组。
示例1
输入:
[4,5,1,6,2,7,3,8],4
返回值:
[1,2,3,4]
(题目来自牛客网)
用C++实现如下
class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
// //思路1,先使用库函数sort进行排序,然后进行求解
// vector<int> res;
// if(k<=0 || k>input.size()) //异常边境情况
// return res;
// sort(input.begin(), input.end()); //使用库函数进行排序
// for(int i=0; i<k; ++i)
// {
// res.push_back(input[i]); //求出结果
// }
// return res;
//思路2,使用快排加二分法(二分的目的主要是没必要排没有意义的一侧了)
vector<int> res;
if(k<=0 || k>input.size()) //异常边境情况
return res;
quicksort(input, 0, n-1, k); //输入的数组,左边界,右边界,以及最小的k个数的k值
vector<int> res;
for(int i = 0; i<k; ++i)
{
res.push_back(input[i]);
}
return res;
}
//快排填坑法,注意是输入的数组的引用(因为有变动)
void quicksort(vector<int> &input, int left, int right, int k)
{
if(left >= right) //递归结束条件
return;
int i = left;
int j = right;
int temp = input[i]; //挖出坑
while(i<j) //一直填坑,直到靠拢(i=j);
{
while(i<j && input[j]>=temp)
j--;
input[i] = input[j];
while(i<j && input[i]<=temp)
i++;
input[j]=input[i];
}
input[i]=temp; //把temp值赋i和j相遇时的坑位
if(i>=k) //i在比较靠后的位置,则排序前一半即可
{
quicksort(input, left, i-1, k);
}else{ //否则两边都需要quicksort
quicksort(input, left, i-1, k);
quicksort(input, i+1, right, k);
}
}
};
纯手撕代码,如果觉得内容不错麻烦点个赞,后面陆续配上Top100算法题通俗易懂的讲解视频,可以花两个月时间完全掌握,进大厂不是梦,转行狗亲测!
以上是关于最小的K个数(NC119/考察次数Top5/难度中等)的主要内容,如果未能解决你的问题,请参考以下文章