CC面试经典寻找数列中的第K大的数和

引言

上节的内容较为复杂,代码不太好看懂,本节来一些比较简单的,但是在面试中较为常见的的,几行代码就能够满足需求。

寻找数组中最小的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];

}

如下图:

结语

本节的内容都不难,只要理解数组也是一个特殊的容器,能够使用容器中的公共函数进行排序即可,阅读本节应该比较舒心




转载请注明:http://www.aierlanlan.com/grrz/4039.html