LeetCode215:数组中第K个最大元素
在未排序的数组中找到第 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个最大元素相关推荐
- Leetcode--215. 数组中第K个最大元素
在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 输出: 5 ...
- Leetcode215数组中第k大的数-最小堆
题目 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 输出 ...
- python 数组中第k个最大元素
数组中第k个最大元素 给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素.示例 1:输入: [3,2 ...
- Leetcode 215.数组中第k个最大元素 (每日一题 20210713)
给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素.示例 1:输入: [3,2,1,5,6,4] 和 ...
- 怎么修改数组中指定元素_求数组中第K大的元素
问题描述 求无序数组int[] nums中第K大的元素. 例如 输入:nums[] = {9,5,8},k = 2 输出:8 输入:nums[] = {3,1,2,4,5,5,6},k = 4 输出: ...
- 数组中第K个最大元素
在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 输出: 5 ...
- 寻找数组中第K频繁的元素
问题是:给你一个数组,求解出现次数第K多的元素.当然leetcode上的要求是算法复杂度不能大于O(N*logN). 首先这个问题我先是在leetcode上看到,当时想了两种做法,做到一半都觉得不是很 ...
- python第k序列元素查找_【python】寻找数组中第k大的元素
题目链接:https://www.nowcoder.com/question/next?pid=13956292&qid=298692&tid=26431616 方法一: 最简单直接的 ...
- 寻找数组中第k大的元素
这算是一道相当经典的算法题了: 在长度为N的乱序数组中寻找第k(n>=k)大的元素. (1)最简单直接的方法:先排序再找 最简单直接的想法是首先进行排序.假设元素的数量不大,比如才几千个,那就可 ...
最新文章
- Spring Cloud - Feign调用问题
- Android杂谈--layout的横竖屏处理
- 实战派:一次kafka卡顿事故排查过程!
- [BUUCTF-pwn]——[Black Watch 入群题]PWN
- 免费当天澳洲运营商全天下载量达1841TB
- 5条件筛选功能_一分钟,彻底学会Excel高级筛选,坐等升职加薪!
- 量子计算还没搞懂,光子计算又要来统治世界?
- redis的发布和订阅模式
- 字节跳动面试题后台_JAVA字节跳动面试题分享,一面
- easyExcel添加背景水印
- 夏普Sharp AR-C260M PS 一体机驱动
- opc服务器网站,OPC 服务器
- python Click库知识点汇总
- winsxs文件夹可以删除吗?具体清理操作如下
- 360n6pro刷鸿蒙系统,因太费电想刷系统,N6Pro哪个版本的系统耗电少,有什么问题或缺点...
- 计算机系统的组成基础知识,计算机系统的组成基础知识.ppt
- java贪吃蛇(障碍物*咬尾巴)
- Vue.js 实战总结
- 图像配准常用评价方法
- 程序员前世今生,从门外汉到菜鸟,再到独当一面,再到思变转行
热门文章
- HDU-6290_奢侈的旅行(Dijstra+堆优化)
- 仅仅用几行python代码偷偷复制U盘文件
- WKWebView不显示提示框(Swift)
- Selenium WebDriver问题--Internet Explorer保护模式设置问题
- C# 制作外挂常用的API
- CSM+3PAR帮助XXX教育技术中心
- regex在.NET里判断输入信息的合法性
- 世界经济增速统一放缓,网络拓扑发现统一增速
- 腾讯云centos7搭建javaweb服务器(本人亲自经历,详细)
- Nginx 0.8.x + PHP 5.2.13(FastCGI)搭建胜过Apache十倍的Web服务器(第6版)