在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
示例:输入: [3,2,1,5,6,4] 和 k = 2
输出: 5

这个问题就是一个排序问题,下面尝试使用不同的排序方法来实现。

快速排序

class Solution:def findKthLargest(self, nums: List[int], k: int) -> int:self.quickSortHelper(nums, 0, len(nums) - 1)return nums[-k]def quickSortHelper(self, nums, first, last):if first < last:splitPoint = self.partition(nums, first, last)self.quickSortHelper(nums, first, splitPoint - 1)self.quickSortHelper(nums, splitPoint + 1, last)def partition(self, nums, first, last):leftmark = firstrightmark = lastbase = nums[first]while leftmark < rightmark:if nums[leftmark] <= base:leftmark += 1if nums[rightmark] >= base:rightmark -= 1else:nums[leftmark], nums[rightmark] = nums[rightmark], nums[leftmark]nums[rightmark], nums[first] = nums[first], nums[rightmark]return rightmark

思路就是《剑指offer》中的Partition版本的一点微小改动。

堆排序

下面介绍一种堆排序的办法。事实上,在这个问题中,使用堆排序要效果更好。因为要输出倒数到k大个数,在使用堆排序的时候,如果我们构建的是最大堆,那么就会从最大值依次排序输出,而我们之前介绍的快排,一定要排好序之后才能找到倒数第k大个数,因此在这个问题中,相比于快排,堆排序效率更高。

在Python中,有一个包叫heapq,就可以帮我们建立堆这个数据结构。因此,我们使用这个包来实现堆排序就简单多了。

heapq介绍

但是这个heapq默认是构建最小堆,而不是最大堆。我们这里要输出倒数第k大个数。做法很简单。我们构建堆的时候,把数字颠倒过来。最大的数变成最小的数,这样堆排序按照最小堆输出的时候,再添加一个负号,实际上又颠倒过来了,这样就相当于按照最大堆来输出了。下面是代码:

class Solution(object):def findKthLargest(self, nums, k):""":type nums: List[int]:type k: int:rtype: int"""from heapq import heappush, heappoph = []for i in nums:heappush(h, -i)for i in range(0, k-1):heappop(h)return -heappop(h)a = Solution()
nums = [1, 2,4,5, 3]
a.findKthLargest(nums, 2)

LeetCode215:数组中第K个最大元素相关推荐

  1. Leetcode--215. 数组中第K个最大元素

    在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 输出: 5 ...

  2. Leetcode215数组中第k大的数-最小堆

    题目 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 输出 ...

  3. python 数组中第k个最大元素

    数组中第k个最大元素 给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素.示例 1:输入: [3,2 ...

  4. Leetcode 215.数组中第k个最大元素 (每日一题 20210713)

    给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素.示例 1:输入: [3,2,1,5,6,4] 和 ...

  5. 怎么修改数组中指定元素_求数组中第K大的元素

    问题描述 求无序数组int[] nums中第K大的元素. 例如 输入:nums[] = {9,5,8},k = 2 输出:8 输入:nums[] = {3,1,2,4,5,5,6},k = 4 输出: ...

  6. 数组中第K个最大元素

    在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 输出: 5 ...

  7. 寻找数组中第K频繁的元素

    问题是:给你一个数组,求解出现次数第K多的元素.当然leetcode上的要求是算法复杂度不能大于O(N*logN). 首先这个问题我先是在leetcode上看到,当时想了两种做法,做到一半都觉得不是很 ...

  8. python第k序列元素查找_【python】寻找数组中第k大的元素

    题目链接:https://www.nowcoder.com/question/next?pid=13956292&qid=298692&tid=26431616 方法一: 最简单直接的 ...

  9. 寻找数组中第k大的元素

    这算是一道相当经典的算法题了: 在长度为N的乱序数组中寻找第k(n>=k)大的元素. (1)最简单直接的方法:先排序再找 最简单直接的想法是首先进行排序.假设元素的数量不大,比如才几千个,那就可 ...

最新文章

  1. Spring Cloud - Feign调用问题
  2. Android杂谈--layout的横竖屏处理
  3. 实战派:一次kafka卡顿事故排查过程!
  4. [BUUCTF-pwn]——[Black Watch 入群题]PWN
  5. 免费当天澳洲运营商全天下载量达1841TB
  6. 5条件筛选功能_一分钟,彻底学会Excel高级筛选,坐等升职加薪!
  7. 量子计算还没搞懂,光子计算又要来统治世界?
  8. redis的发布和订阅模式
  9. 字节跳动面试题后台_JAVA字节跳动面试题分享,一面
  10. easyExcel添加背景水印
  11. 夏普Sharp AR-C260M PS 一体机驱动
  12. opc服务器网站,OPC 服务器
  13. python Click库知识点汇总
  14. winsxs文件夹可以删除吗?具体清理操作如下
  15. 360n6pro刷鸿蒙系统,因太费电想刷系统,N6Pro哪个版本的系统耗电少,有什么问题或缺点...
  16. 计算机系统的组成基础知识,计算机系统的组成基础知识.ppt
  17. java贪吃蛇(障碍物*咬尾巴)
  18. Vue.js 实战总结
  19. 图像配准常用评价方法
  20. 程序员前世今生,从门外汉到菜鸟,再到独当一面,再到思变转行

热门文章

  1. HDU-6290_奢侈的旅行(Dijstra+堆优化)
  2. 仅仅用几行python代码偷偷复制U盘文件
  3. WKWebView不显示提示框(Swift)
  4. Selenium WebDriver问题--Internet Explorer保护模式设置问题
  5. C# 制作外挂常用的API
  6. CSM+3PAR帮助XXX教育技术中心
  7. regex在.NET里判断输入信息的合法性
  8. 世界经济增速统一放缓,网络拓扑发现统一增速
  9. 腾讯云centos7搭建javaweb服务器(本人亲自经历,详细)
  10. Nginx 0.8.x + PHP 5.2.13(FastCGI)搭建胜过Apache十倍的Web服务器(第6版)