在未排序的数组中找到第 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个最大元素的更多相关文章

  1. Leetcode题目215.数组中的第K个最大元素(中等)

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

  2. leetcode.排序.215数组中的第k个最大元素-Java

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

  3. Java实现 LeetCode 215. 数组中的第K个最大元素

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

  4. 215. 数组中的第K个最大元素 + 快速排序 + 大根堆

    215. 数组中的第K个最大元素 LeetCode-215 另一道类似的第k大元素问题:https://www.cnblogs.com/GarrettWale/p/14386862.html 题目详情 ...

  5. LeetCode 215——数组中的第 K 个最大元素

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

  6. Leetcode 215.数组中的第k个最大元素

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

  7. [LeetCode]215. 数组中的第K个最大元素(堆)

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

  8. Leetcode 215. 数组中的第K个最大元素 By Python

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

  9. LeetCode 215. 数组中的第K个最大元素(Kth Largest Element in an Array)

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

随机推荐

  1. 适配相关:viewpoint,@media,vw/vh,em/rem

    从网易与淘宝的font-size思考前端设计稿与工作流: http://www.cnblogs.com/lyzg/p/4877277.html Rem布局的原理解析: https://yanhaiji ...

  2. 省市区JSON

    行政编码 ViewBag.CssLinks = ""; 行政编码 中国和韩国行政编码选择.数据来自json文件,但在前端通过json对象调用. 注意本地方式,是将json文件作为对 ...

  3. Tomcat 部署java web项目直接ip地址访问项目

    正常情况下,在访问在Tomcat中部署的项目是 http://localhost:8080/demo 方式 其中,IP,端口,项目名(Demo)都是必须的. 那么,怎么样才能通过 http://loc ...

  4. Mysql加锁过程详解(9)-innodb下的记录锁,间隙锁,next-key锁

    Mysql加锁过程详解(1)-基本知识 Mysql加锁过程详解(2)-关于mysql 幻读理解 Mysql加锁过程详解(3)-关于mysql 幻读理解 Mysql加锁过程详解(4)-select fo ...

  5. C# this扩展方法

    本文导读:扩展方法被定义为静态方法,但它们是通过实例方法语法进行调用的. 它们的第一个参数指定该方法作用于哪个类型,并且该参数以 this 修饰符为前缀. 扩展方法当然不能破坏面向对象封装的概念,所以 ...

  6. 【转载】C++ vector的用法

    http://www.cnblogs.com/Nonono-nw/p/3462183.html

  7. 部署自己的服务器ubuntu

    一直都是在公司的服务器上工作,想搞点自己的idea比较不方便,所以近期租了要给自己的阿里云服务器. 以下为必要的软件的安装流程: jdk+jre: 1.去官网下载 jdk-linux版本: 2.解压压 ...

  8. Vue.js 技术揭秘(学习) vue流程

    new Vue() _init() mergeOptions $watch --> new Watch vm._render 生成VNode create diff patch vm._upda ...

  9. Python 入门基础15 --shutil、shelve、log常用模块2、项目结构

    今日内容: 一.常用模块 2019.04.10 更新 1.time:时间 2.calendar:日历 3.datatime:可以运算的时间 4.sys:系统 5.os:操作系统 6.os.path:系 ...

  10. javascript基础 之 保留关键字

    1,保留关键字 意思是:特定的字符串要么是已经有指代了要么是未来将要有指代,所以取名字不要用保留关键字里的字符串 js保留关键字 abstract arguments boolean break by ...