在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
解析:这个题目对我来说是有点难度的。如果直接用sort排序然后找到第k个显然过于tricky,不是算法要考察的思路。答案中提供了三种解法。
解法一:快速选择。快速选择是用于找第i个最小的元素的,但是这里通样可以用于找第k个最大的元素,也就是找第n-k个最小的元素。思路就是先随机选择一个元素,以这个元素为标准,小于该元素的向该元素左侧移动,大于该元素的向该元素右侧移动。我们就知道这个元素在该数组中的排序位置了。如果这个排序位置等于我们要找的n-k,那么就可以直接输出。如果这个排序位置大于n-k,那么我们下面就只需要对该元素左侧的部分进行通样的快速选择。如果这个排序位置小于n-k,那么我们下面就只需要对该元素右侧的部分进行通样的快速选择。
因此,首先要实现一个根据基准元素移动原始数组位置的函数。这个函数的输入是左/右/基准元素,原始数组,输出是移动后的数组和基准元素的位置。这样我们只需要判断基准元素的位置与目标n-k的大小对比.在原始数组上进行移动,采用了两个指针,第一个指针指向0位置,第二个指针依次循环,如果循环的值小于对比值,则将该值与第一个指针交换位置,第一个指针向后移动一位。否则,pass。这种在原数组上的移动,尝尝使用两个指针,需要记住。
在完成这个函数之后,判断逻辑是比较目标位置和基准元素的排序位置,根据比较结果,再调用更新数组排序的函数,再根据比较结果,再调用,其实也就是重复地进行这个步骤,因此可以写成递归的形式,反复调用该判断函数本身。终止条件则为更新数组排序的函数(左==右)/排序位置等于我们要找的n-k;
** 最好自己再实现一遍 **
网友评论