在数组中找到第k大的元素

样例

给出数组[9,3,2,4,8],第三大的元素是4

给出数组 [1,2,3,4,5],第一大的元素是5,第二大的元素是4,第三大的元素是3,以此类推

注意

你可以交换数组中的元素的位置

挑战

要求时间复杂度为O(n),空间复杂度为O(1)

分析:利用快排的思想,不断partition

 <?php
//第k大元素 //用快排的思想:例如找7个元素里面第2大的元素,那么按如下步骤:
//1.进行一次快排(将大的元素放在前半段,小的元素放在后半段), 假设得到的中轴为p
//2.判断 p == len - k,如果成立,直接输出a[p]
//3.如果 p > len - k, 则第k大的元素在前半段,此时更新high = p - 1,继续进行步骤1
//4.如果 p < len - k, 则第k大的元素在后半段,此时更新low = p + 1, ,继续步骤1.
//由于常规快排要得到整体有序的数组,而此方法每次可以去掉"一半"的元素,故实际的复杂度不是o(nlgn), 而是o(n)。
function solution(&$data, $low, $high, $k)
{
if($low == $high)//与快排不一致的地方,否则$low=$high的情况下会没有返回值
{
return $data[$low];
}
$p = partition($data, $low, $high);
$index = count($data) - $k;
if($p < $index) {
return solution($data, $p+1, $high, $k);
} else if($p > $index) {
return solution($data, $low, $p-1, $k);
} else {
return $data[$p];
}
} function partition(&$data, $low, $high)
{
$key = $data[$low];
while($low < $high)
{
while($low<$high && $data[$high]>$key) $high--;
$data[$low] = $data[$high];
while($low<$high && $data[$low]<$key) $low++;
$data[$high] = $data[$low];
}
$data[$low] = $key;
return $low;
} $arr = [4, 3, 5, 6, 2, 1, 7];
$k = 2;
$res = solution($arr, 0, count($arr)-1, $k);
echo "<pre>";
print_r($res);

第k大元素的更多相关文章

  1. 【转载】两个排序数组的中位数 / 第K大元素(Median of Two Sorted Arrays)

    转自 http://blog.csdn.net/zxzxy1988/article/details/8587244 给定两个已经排序好的数组(可能为空),找到两者所有元素中第k大的元素.另外一种更加具 ...

  2. lintcode 中等题:kth-largest-element 第k大元素

    题目 第k大元素 在数组中找到第k大的元素 样例 给出数组[9,3,2,4,8],第三大的元素是4 给出数组 [1,2,3,4,5],第一大的元素是5,第二大的元素是4,第三大的元素是3,以此类推 注 ...

  3. 寻找两个已序数组中的第k大元素

    寻找两个已序数组中的第k大元素 1.问题描述 给定两个数组与,其大小分别为.,假定它们都是已按照增序排序的数组,我们用尽可能快的方法去求两个数组合并后第大的元素,其中,.例如,对于数组,.我们记第大的 ...

  4. 面试题:求第K大元素(topK)?

    一.引言二.普通算法算法A:算法B:三.较好算法算法C:算法D:四.总结 一.引言 ​ 这就是类似求Top(K)问题,什么意思呢?怎么在无序数组中找到第几(K)大元素?我们这里不考虑海量数据,能装入内 ...

  5. java优先级队列的使用 leecode.703.数据流中的第K大元素

    //设计一个找到数据流中第K大元素的类(class). //注意是排序后的第K大元素,不是第K个不同的元素. class KthLargest { private PriorityQueue<I ...

  6. [Swift]LeetCode703. 数据流中的第K大元素 | Kth Largest Element in a Stream

    Design a class to find the kth largest element in a stream. Note that it is the kth largest element ...

  7. 数据流中的第k大元素的golang实现

    设计一个找到数据流中第K大元素的类(class).注意是排序后的第K大元素,不是第K个不同的元素. 你的 KthLargest 类需要一个同时接收整数 k 和整数数组nums 的构造器,它包含数据流中 ...

  8. [LeetCode解题报告] 703. 数据流中的第K大元素

    题目描述 设计一个找到数据流中第K大元素的类(class).注意是排序后的第K大元素,不是第K个不同的元素. 你的 KthLargest 类需要一个同时接收整数 k 和整数数组nums 的构造器,它包 ...

  9. LintCode——第K大元素

    第K大元素:在数组num中找到第k大的元素(可以交换数组中的元素的位置) 样例: 数组 [9,3,2,4,8],第三大的元素是 4 数组 [1,2,3,4,5],第一大的元素是 5,第二大的元素是 4 ...

随机推荐

  1. ElasticSearch(七) Elasticsearch在Centos下搭建可视化服务

    要想可视化ElasticSearch,就需要安装一些插件,安装插件的前提是安装所依赖的环境,比如java,maven等,本篇博文就不再走那些流程了.没安装的童鞋可以看我的ElasticSearch栏目 ...

  2. python爬虫——与不断变化的页面死磕和更新换代(3)

    经过上一次的实战,手感有了,普罗西(雾)池也有了,再战taobao/tmall 试着使用phantomJS爬手机端,结果发现爬来的tmall页面全是乱码,taobao页面xpath识别错误.一顿分析了 ...

  3. iptables 扩展匹配 第三章

    获取帮助: centos 6 :man iptables centos 7: man iptables-extensions 扩展匹配: 隐式扩展:当使用-p指定某一协议之后,协议自身所支持的扩展就叫 ...

  4. Html br 标签

    Html br 标签 <html> <body> <!-- br标签:跳到下一行--> <p>内<br />容</p> 注:br ...

  5. opencv3.0之后IPLimage转换成MAT的问题

    转自http://www.cnblogs.com/edver/p/5187190.html IplImage * ipl = ...; cv::Mat m = cv::cvarrToMat(ipl); ...

  6. SQLServer “无法对数据库'XX' 执行删除,因为它正用于复制”的解决方法

    修改数据库某个字段的长度时出现: “无法修改表.无法对 表'dbo.N_Client_content' 执行 删除,因为它正用于复制.” 不能直接对该数据库进行操作,通过alter 的办法来修改,问题 ...

  7. TensorFlow和Keras完成JAFFE人脸表情识别

    cut_save_face.py #!/usr/bin/python # coding:utf8 import cv2 import os import numpy as np import csv ...

  8. Learning-Python【1】:交互式环境与变量的使用

    一.执行Python程序的两种方式 1. 交互式环境,打开cmd,输入python2或python3,显示提示符 “>>>”. 特点:输出代码立即执行 优点:调试程序方便 缺点:无法 ...

  9. 3.1 eureka自我保护

    故障现象: Down:是下线(掉线)的意思. 导致原因: 一句话:某时刻某一个微服务不可用了,eureka不会立刻清理,依旧会对该微服务的信息进行保存 什么是自我保护模式? 默认情况下,如果Eurek ...

  10. [原][译][jsbsim]空气动力学模型库讨论JSBSim对比YASim

    英文原文:JSBSim_vs_YASim 准确性和现实性飞行动力学模型的准确性和真实性是针对YASim的争论中提出的两个共同点.实际上,如果你给YASim或JSBSim垃圾参数,它们都将返回垃圾空气动 ...