引言
上节的内容较为复杂,代码不太好看懂,本节来一些比较简单的,但是在面试中较为常见的的,几行代码就能够满足需求。
寻找数组中最小的K个数
需求:
给定一个长度为n的可能有重复值的数组,找出其中不去重的最小的k个数。例如数组元素是4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4(任意顺序皆可)。
代码设计思路:由于数组也是容器中的一种,所以对于数组的元素可以直接使用sort函数对其进行排序,然后输出前K个值就是本例需要的结果了。
测试用例:
示例1
输入:
[4,5,1,6,2,7,3,8],4
复制
返回值:
[1,2,3,4]
复制
说明:
返回最小的4个数即可,返回[1,3,2,4]也可以
示例2
输入:
[1],0
复制
返回值:
[]
复制
示例3
输入:
[0,1,2,1,2],3
复制
返回值:
[0,1,1]
代码示例:
vectorintGetLeastNumbers_Solution(vectorintinput,intk)
{
vectorintres;
if(k==0
kinput.size())
{
returnres;
}
sort(input.begin(),input.end());
returnvectorint({input.begin(),input.begin()+k});
}
寻找数组中第K大的数
需求:
有一个整数数组,请你根据快速排序的思路,找出数组中第k大的数。
给定一个整数数组a,同时给定它的大小n和要找的k,请返回第k大的数(包括重复的元素,不用去重),保证答案存在。
代码设计思路:和上一个示例一样,本例只需要将数组使用sort函数排序,输出倒数第K个数即可。
示例1
输入:
[1,3,5,2,2],5,3
复制
返回值:
2
复制
示例2
输入:
[10,10,9,9,8,7,5,6,4,3,4,2],12,3
复制
返回值:
9
复制
说明:
去重后的第3大是8,但本题要求包含重复的元素,不用去重,所以输出9
intfindKth(vectorinta,intn,intK){
//writecodehere
if(K0
Kn)
{
return0;
}
sort(a.begin(),a.end());
returna[n-K];
}
如下图:
结语
本节的内容都不难,只要理解数组也是一个特殊的容器,能够使用容器中的公共函数进行排序即可,阅读本节应该比较舒心