算法 - 数组中的第K个最大元素

题目:

在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。

示例 1:

输入: [3,2,1,5,6,4] 和 k = 2
输出: 5
示例 2:

输入: [3,2,3,1,2,4,5,5,6] 和 k = 4
输出: 4
说明:

你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。

分析:
查找未排序的数组,找到第k个最大的元素。
最简单的做法应该就是对数组进行排序,然后遍历拿到第k个最大元素。那么此时这道题就是一道排序题了。

但是如果是这样的话,这道题就没有必要了。应该有其他解法,不需要进行排序就可以搞定。

因为要取的是第k个,所以感觉不需要进行完全排序即可。
这个时候想起来快速排序。快速排序的特点是先找一个基准,让大于这个基准的放在一边(命名为Array),小于这个基准的放在领一边。

  • 如果Array个数是k-1,那么这个基准就正好是第k个。
  • 如果Array个数大于k-1,说明第k大元素还是在左边,继续对左边进行重复操作
  • 如果Array个数小于k-1,说明第k大元素在右边数组里,要对右边的数组进行重复操作。
class Solution:
    def quickSort(self,left,right,nums,k) :
        head,trail,temp = left,right,nums[left]
        if head >= trail:
            return nums[trail]
        #大的放在左边,小的放在右边
        while head < trail:
            while head < trail and nums[trail] <= temp:
                trail -= 1
            nums[head] = nums[trail]
            while head < trail and nums[head] >= temp:
                head +=1
            nums[trail] = nums[head]
        nums[head] = temp
        if head-left == k-1: # 判断是否head就是第k个元素
            return temp
        elif head-left > k-1: # 说明第k大元素在左边
            return self.quickSort(left,head-1,nums,k)
        else: # 说明第k大元素在右边 此时需要重新计算k(这个位置是重点)
            return self.quickSort(head+1,right,nums,k-head-1+left)
        
    def findKthLargest(self, nums: List[int], k: int) -> int:
        return self.quickSort(0,len(nums)-1,nums,k)
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 排序算法说明 (1)排序的定义:对一序列对象根据某个关键字进行排序; 输入:n个数:a1,a2,a3,…,an 输...
    code武阅读 3,928评论 0 0
  • 如何寻找无序数组中的第K大元素? 有这样一个算法题:有一个无序数组,要求找出数组中的第K大元素。比如给定的无序数组...
    Brandon_Murphy阅读 3,613评论 0 0
  • 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面;不稳定:如果a原本在b的前面,而a=b,排序之后a可...
    意识流丶阅读 8,428评论 2 9
  • 開發,是有技巧的, 比方以前最喜歡仙人指路, 在巷子找一位看起來熱心的長者, 隨手指一間,說,請問, 您知道是這間...
    臣德地產邱俊瑋阅读 1,306评论 0 1
  • 梅杉雨蝶阅读 39评论 0 0

友情链接更多精彩内容