【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 ≤ 数组的长度。
解题思路
使用快速排序的思想来解题
每次选择数组中最后一个元素作为目标值pivot,然后从头到尾扫描数组,使< pivot的元素在pivot左边,>= pivot的元素在pivot右边,再计算pivot在数组中的位置,(递归地)调整下一次quickSelect的范围。pivot偏大,下次就在左边找第k个;pivot偏小,下次就在右边找第k-m个。
Java 实现
public int findKthLargest (int[] nums, int k) {
    int n = nums.length;
    int p = quickSelect(nums, 0, n - 1, n - k + 1);
    return nums[p];
}
// 此处的 k 是按从小到大排的顺序
// return the index of the kth smallest number
private int quickSelect (int[] nums, int lo, int hi, int k) {
    int i = lo;
    int j = hi;
    int pivot = nums[hi];
    // < pivot 放左边
    // >= pivot 放右边
    while (i < j) {
        if (nums[i++] > pivot) swap(nums, --i, --j);
    }
    swap(nums, i, hi); // 将 pivot 放入正确位置
    // 计算 pivot 在数组中的位置
    int m = i - lo + 1;
    if (m == k) return i;
    else if (m > k) return quickSelect(nums, lo, i - 1, k);
    else return quickSelect(nums, i + 1, hi, k - m);
}
private void swap (int[] nums, int i, int j) {
    int temp = nums[i];
    nums[i] = nums[j];
    nums[j] = temp;
}
心得体会
快速排序的关键是正确地切分数组。
【LeetCode】215-数组中的第K个最大元素的更多相关文章
- Java实现 LeetCode 215. 数组中的第K个最大元素
		
215. 数组中的第K个最大元素 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6 ...
 - 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 ...
 - leetcode 215. 数组中的第K个最大元素(python)
		
在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2输出: 5示 ...
 - LeetCode:数组中的第K个最大元素【215】
		
LeetCode:数组中的第K个最大元素[215] 题目描述 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: ...
 - 215. 数组中的第K个最大元素 + 快速排序 + 大根堆
		
215. 数组中的第K个最大元素 LeetCode-215 另一道类似的第k大元素问题:https://www.cnblogs.com/GarrettWale/p/14386862.html 题目详情 ...
 - Leetcode题目215.数组中的第K个最大元素(中等)
		
题目描述: 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 ...
 
随机推荐
- Visual Studio Debug
			
在watch窗口输入,$err,hr可以看到上一个错误代码和相关描述信息 Error Lookup可以将错误代码转换成为相应的文本描述 FormatMessage()
 - java之异常详解
			
一.什么是异常? 异常就是有异于常态,和正常情况不一样,有错误出错.在java中,阻止当前方法或作用域正常运行的情况,称之为异常. 二.异常体系 Java把异常当作对象来处理,并定义一个基类java. ...
 - Netty源码分析--内存模型(下)(十二)
			
这一节我们一起看下分配过程 PooledByteBuf<T> allocate(PoolThreadCache cache, int reqCapacity, int maxCapacit ...
 - Sqlserver 查询分组 记录
			
select b.* from (select a.*,row_number() over (partition by 列1 order by 列2 desc) rn from a) b ; --如需 ...
 - java并发系列 - 第29天:高并发中常见的限流方式
			
这是java高并发系列第29篇. 环境:jdk1.8. 本文内容 介绍常见的限流算法 通过控制最大并发数来进行限流 通过漏桶算法来进行限流 通过令牌桶算法来进行限流 限流工具类RateLimiter ...
 - 如何让springboot打包的项目部署在阿里云上使用https和http方式访问
			
前言 问题描述:怎么让springboot部署在服务器上使用https协议方式访问我们的接口或者域名,目的是某些平台请求的是https协议,而不是https 部署环境:阿里云 centos7服务器,s ...
 - Vue中 父子传值 数据丢失问题
			
在Vue中,父子组件传值,子组件通过props接收父组件传递的数据 父组件 questionList : 传递数据参数 questionsLists: 传递数据源 子组件 porps 接收父组件方式 ...
 - pip安装ansible的过程
			
我的python环境已经搭好了pip,可以用pip直接安装. 1.首先要安装基础环境: 1)yum install gcc glibc-devel zlib-devel rpm-build opens ...
 - Codeforces 246C
			
题意略. 思路: 我们将数组中的数字从大到小排列,分别考虑取前0 + 1,1 + 1,2 + 1.....个的情况. 所谓i + 1的意思是,取前i个的时候,同时取第[i + 1],[i + 2],. ...
 - Java中集合的概述
			
一.集合和数组的区别 1.数组(可以存储基本数据类型)是用来存现对象的一种容器,但是数组的长度固定,不适合在对象数量未知的情况下使用. 2.集合(只能存储对象,对象类型可以不一样)的长度可变,可在多数 ...