LeetCode题解 | 215. 数组中的第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 ≤ 数组的长度。
大家看到这道题很高兴的调用了sort(),也有手搓快排的那么时间复杂度都在O(nlgn)
我们仔细想想快排的思想 本质上是在划分 那么我们先愉快的写一个划分吧
注意这里要从大到小了
int partition(vector<int>& nums, int l,int r){
int temp = nums[l];
while(l < r){
int temp = nums[l];
while(l < r){
while(l < r && nums[r] <= temp) r--;
swap(nums[l],nums[r]);
while(l < r && nums[l] >= temp) l++;
swap(nums[l],nums[r]);
}
}
nums[l] = temp;
return l;
}
这里我们执行了一次划分操作,即把基准temp放在了一个位置,基准前的都比基准大,基准后的都比基准小 l就是基准最后所在的位置
那么这是想一想 如果l刚好和k-1相等(假设数组下标从0开始) 那么基准不就是要找的数字吗(前面有k-1个比他大的 他就是第k大的) 我们就可以愉快的返回了;如果 l > k-1那么很不幸运,我们的基准选的有点小了 造成基准是第k+eps(eps=1、2...)个大的元素,那么我们就在[left,l-1]这个区间找找;反正,基准选大了,就在[l+1,right]里面找找
int search(vector<int>& nums,int l,int r,int k){
int m =partition(nums,l,r);
if(m == k-1) return nums[m];
else if(m > k-1) return search(nums,l,m-1,k);
else return search(nums,m+1,r,k);
}
这样就解决了问题。
我们并没有对数组进行排序,而是根据情况递归的寻找第k大的数,因此复杂度是比快排本身要低的,为O(n)。
但是如果数组本身就是有序的情况下,复杂度还是会飙升至O(n^2 )
关于这个问题的详细复杂度分析可以看看算导的第九章
完整函数代码 想尝试的可以移步leetcode
https://leetcode-cn.com/problems/kth-largest-element-in-an-array/description/
int partition(vector<int>& nums, int l,int r){
int temp = nums[l];
while(l < r){
int temp = nums[l];
while(l < r){
while(l < r && nums[r] <= temp) r--;
swap(nums[l],nums[r]);
while(l < r && nums[l] >= temp) l++;
swap(nums[l],nums[r]);
}
}
nums[l] = temp;
return l;
}
int search(vector<int>& nums,int l,int r,int k){
int m =partition(nums,l,r);
if(m == k-1) return nums[m];
else if(m > k-1) return search(nums,l,m-1,k);
else return search(nums,m+1,r,k);
}
int findKthLargest(vector<int>& nums, int k) {
int length = nums.size();
if(k > length) return 0;
else return search(nums,0,length-1,k);
}
LeetCode题解 | 215. 数组中的第K个最大元素的更多相关文章
- Leetcode题目215.数组中的第K个最大元素(中等)
题目描述: 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 ...
- leetcode.排序.215数组中的第k个最大元素-Java
1. 具体题目 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 : 输入: [3,2,1,5,6,4] 和 k = ...
- Java实现 LeetCode 215. 数组中的第K个最大元素
215. 数组中的第K个最大元素 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6 ...
- 215. 数组中的第K个最大元素 + 快速排序 + 大根堆
215. 数组中的第K个最大元素 LeetCode-215 另一道类似的第k大元素问题:https://www.cnblogs.com/GarrettWale/p/14386862.html 题目详情 ...
- LeetCode 215——数组中的第 K 个最大元素
1. 题目 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 ...
- Leetcode 215.数组中的第k个最大元素
数组中的第k个最大元素 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 ...
- [LeetCode]215. 数组中的第K个最大元素(堆)
题目 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 输出 ...
- Leetcode 215. 数组中的第K个最大元素 By Python
在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 输出: 5 ...
- LeetCode 215. 数组中的第K个最大元素(Kth Largest Element in an Array)
题目描述 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 ...
随机推荐
- nginx的location配置root、alias用法和区别
root & alias区别root与alias主要区别在于nginx如何解释location后面的uri,这会使两者分别以不同的方式将请求映射到服务器文件上root的处理结果是:root路径 ...
- POJ--3349 Snowflake Snow Snowflakes(数字hash)
链接:Snowflake Snow Snowflakes 判断所有的雪花里面有没有相同的 每次把雪花每个角的值进行相加和相乘 之后hash #include<iostream> #incl ...
- java 11 不可修改集合API
不可修改集合API 自 Java 9 开始,Jdk 里面为集合(List/ Set/ Map)都添加了 of 和 copyOf 方法,它们两个都用来创建不可变的集合,来看下它们的使用和区别. 示例1: ...
- 关于try catch finally 三者之间的关系(JDK 1.8)
话不多说 线上代码 package System; import java.util.Scanner; /** * * @author chris * */ public class TryCathf ...
- 存在多个 AJAX 任务
实现的效果: 这两个Ajax任务可同时实现,也可单独实现. 标准的函数: var xmlhttp; function loadXMLDoc(url,ufunc){ if(window.XMLHttpR ...
- Tensorflow基本语法
一.tf.Variables() import tensorflow as tf Weights = tf.Variable(tf.random_uniform([1], -1.0, 1.0)) se ...
- Jasmine
Jasmine https://www.npmjs.com/package/jasmine The Jasmine Module The jasmine module is a package of ...
- EffectiveC++ 第3章 资源管理
我根据自己的理解,对原文的精华部分进行了提炼,并在一些难以理解的地方加上了自己的"可能比较准确"的「翻译」. Chapter 3 资源管理 条款13: 以对象管理资源 有时即使你顺 ...
- Java CAS 比较并且更换值
原文:Java中CAS详解 作者:jayxu无捷之径 在JDK 5之前Java语言是靠synchronized关键字保证同步的,这会导致有锁 锁机制存在以下问题: (1)在多线程竞争下,加锁.释放锁会 ...
- Flink学习(二)Flink中的时间
摘自Apache Flink官网 最早的streaming 架构是storm的lambda架构 分为三个layer batch layer serving layer speed layer 一.在s ...