【215】第K个大的数,K相关题目-分治、堆应用
1、从大到小第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个数。首先想到的是对数组排序,直接sort()取k-1个数。复杂度为
O(NlogN).
方法二:根据快排中partition的思想,进行分治,,存在情况1:[left,k,p,right] 情况2:[left,p,k,right]
对于情况1继续遍历[left,p],情况2继续遍历[p,right].
class Solution(object):def findKthLargest(self, nums, k):""":type nums: List[int]:type k: int:rtype: int"""#partitiondef core(left,right,nums,k):r = nums[right]i = leftlittle = right-1while i<=little:if nums[i]>=r:i+=1 else:#交换i,littleself.swap(i,little,nums)little-=1self.swap(i,right,nums)if i==k-1:return nums[i]elif i<k-1:return core(i+1,right,nums,k)else:return core(left,i-1,nums,k)return core(0,len(nums)-1,nums,k)def swap(self,i,j,nums):tmp = nums[i]nums[i] = nums[j]nums[j] = tmp
2、从大到小第K大的数
3、数据流的中位数
搞成两个堆,大根堆,小根堆。两个堆中元素最多不相差1。大根堆顶、小根堆顶元素求平均数。
对于每个从数据流中新进来数来讲:若是偶数index放进大根堆,反之放进小根堆,这样保证了大小根堆的数量差值不多于1.但同时又需要保证大根堆中所有数字都要小于等于根堆中的数。所以新来的数偶数idx的数,先和小根堆顶比较,若大于小根堆顶,则把小根堆顶数字拿出放进大根堆,并将新数放进小根堆。
【215】第K个大的数,K相关题目-分治、堆应用相关推荐
- 利用快排查询无序数组第k位大的数
由于快速排序的partion函数返回值是基准值最终的位置,由此可以启发得出当这个位置刚好是第k位时,直接输出它下标对应的值,如果这个位置大于第k位时,则向该基准位置的左边递归:如果这个位置小于第k位时 ...
- 第k个数, (第k个大的数)
第k个数 给定一个长度为 n 的整数数列,以及一个整数 k,请用快速选择算法求出数列从小到大排序后的第 k 个数. 输入格式 第一行包含两个整数 n 和 k. 第二行包含 n 个整数(所有整数均在 1 ...
- 得到第K个大的数算法研究
本文为原创,如需转载,请注明作者和出处,谢谢! 第一种算法是最容易想到的,就是利用快速排序的思想,将一个数组分成以某一个数X为轴,左边的所有的数都比X小,而右边的数都比X大.但我快速排序不同的是,在这 ...
- 两数、三数、四数之和相关题目(Leetcode题解-Python语言)
作为 Leetcode 的第一题,两数之和自然是知名度最高的,从两数之和出发也有不少的衍生题目,下面就让我们好好地解决它们. 1. 两数之和 class Solution:def twoSum(sel ...
- c语言判断数组里的数据先递增后递减,查找两个有序序数组(一个递增、一个递减)中第K大的数...
题目不难,关键是边界条件要想清楚.先写一个时间复杂度为O(K) 的解法. #include using namespace std; //a[] increase //b[] decrease //u ...
- java寻找数组中第k大的数
快速排序思想,先找数组第k小的数,当执行一次partition函数找到index下标时,index左边的数比arr[index]小,右边的数比arr[index]大 public class Test ...
- [leetcode]堆排序 求前k大的数
前一篇博客中写到了排序算法,其中包含一个堆排序,因此本篇博客讲解堆这个数据结构及其应用. 关于最大堆最小堆以及初始建堆和整理堆在上篇博客中有提及,此处不再赘述.下面讲解一个堆的重要应用,求n个数中前k ...
- 将一个数组中的值按逆序重新排放。_六十五、下一个更大的数系列,单调栈解决方法...
「@Author:Runsen」 ❝ 编程的本质来源于算法,而算法的本质来源于数学,编程只不过将数学题进行代码化. 「---- Runsen」 ❞ 据说,放张小姐姐觉得照片可以提高阅读量,图是来源学校 ...
- java实现小顶堆 在指定数据中找出前n大的数
小顶堆: 我们利用的特性:每个节点都比左右孩子小 图示: 取数组前n个数,构成小顶堆 然后从数组里面获取数据,如果比堆顶小,直接抛弃,如果比堆顶大,就替换堆顶,并调整堆,使堆始终满足小顶堆的特性 93 ...
最新文章
- 安装64位Oracle 10g超详细教程
- 基于大数据审计的信息安全日志分析法
- 【错误记录】Visual Studio 编译 C++ 代码报错 ( To disable deprecation, use _CRT_SECURE_NO_WARNINGS. )
- idea启动多个tomcat失败
- 数据库编程——intro to JDBC
- Diango博客--22.Django Haystack 全文检索与关键词高亮
- H3C的DHCP中继配置命令
- C语言程序设计double,C语言中double类型数据占字节数为
- Java中的非对称加密算法RSA实现
- 源码解析——消息机制
- [LeetCode]Balanced Binary Tree
- ImageJ-计算创面面积 此博文包含图片	(2014-01-28 15:59:14)
- 自定义条件查询_跟我学shardingjdbc之自定义分库分表策略-复合分片算法自定义实现...
- 爬虫项目#4567电影网scrapy数据爬取moviePro/持久化储存handReqPro
- Stanford nlp 初步之词性标注
- 计算机毕业设计——基于Spring Boot框架的在线导游预约系统
- 研究生毕业后工资高多少?
- 【Java基础快速入门】概述及开发环境搭建
- 硬件产品经理的学习之路(一)
- winmail 数据库设置_Windows - 2003下搭建邮件服务器教程和使用 - Winmail - Server - 轻松架设邮件服务器 - 图文...