经典算法:无序数组寻找第K大数值
经典算法:无序数组寻找第K大数值
ivansli1. 寻找第K大数值
题意
1 | 有一个无序整数数组,请你根据排序思路,找出数组中第K大的数。 |
示例
输入 [3,2,1,5,6,4] , 2
返回值 5
2. 常规思路
1 | 先对无序数组进行排序,然后对有序数组进行查找。 |
至于选择什么排序算法,有待确定。
先看一下,各种排序算法的复杂度以及稳定性。
看完上面比较之后,可能你心中已经有了自己的答案。
3. 解题思路
常规思路需要两大步:
- 先整体排序
- 在有序中查找目标值
那么,针对这道题,我们能不能在排序的过程中就确定目标值呢?
思考一下快排的二分特性:
- 先找出一个数值的位置,该数值的左侧比自己小,右侧比自己大(整个数组一分为二)
- 再分别进行左、右两部分进行步骤1的操作,直至整个数组有序。
这里需要知道的是,在快排中某个数值左侧比自己小,右侧比自己大。该数值的位置就是在最终有序数组中的位置,也就是说可以在查找中确定目标位置。并且,在本题的处理过程中,平均情况下只处理1/2的数据量。
快排算法查找过程:
4. Go代码实现
1 | func findKLargest(arr []int, k int) int { |
求第K大,则对数组排序排列。
求第K小,则对数组正序排列。
无论如何,都是从头开始找,这样处理更简单。
5. 算法题出处
牛客网- 寻找第K大:
https://www.nowcoder.com/practice/e016ad9b7f0b45048c58a9f27ba618bf