[100天算法】-数组中的第 K 个最大元素(day 54)

news/2024/11/7 14:33:42/

题目描述

在未排序的数组中找到第 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 ≤ 数组的长度。来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/kth-largest-element-in-an-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

方法 1:排序

思路

直接给数组降序排序,再输出第 k-1 个数字。

复杂度分析

  • 时间复杂度:$O(NlogN)$,N 是数组长度。
  • 空间复杂度:$O(1)$。

代码

JavaScript Code

/*** @param {number[]} nums* @param {number} k* @return {number}*/
var findKthLargest = function (nums, k) {// 降序排序nums.sort((a, b) => b - a);return nums[k - 1];
};

方法 2:小顶堆

思路

维护一个大小为 k 的小顶堆,最后输出堆顶。

大顶堆也可以,就不写了。

复杂度分析

  • 时间复杂度:$O(klogk)$。
  • 空间复杂度:$O(k)$。

代码

JavaScript Code

/*** @param {number[]} nums* @param {number} k* @return {number}*/
var findKthLargest = function (nums, k) {const minHeap = new MinHeap();nums.forEach(n => {const size = minHeap.size();if (size < k) minHeap.insert(n);else if (size === k) {if (minHeap.peek() < n) {minHeap.pop();minHeap.insert(n);}}});return minHeap.peek();
};// *************************************************class Heap {constructor(list = [], comparator) {this.list = list;this.comparator = comparator;this.init();}init() {const size = this.size();for (let i = Math.floor(size / 2) - 1; i >= 0; i--) {this.heapify(this.list, size, i);}}insert(n) {this.list.push(n);const size = this.size();for (let i = Math.floor(size / 2) - 1; i >= 0; i--) {this.heapify(this.list, size, i);}}peek() {return this.list[0];}pop() {const last = this.list.pop();if (this.size() === 0) return last;const returnItem = this.list[0];this.list[0] = last;this.heapify(this.list, this.size(), 0);return returnItem;}size() {return this.list.length;}
}class MinHeap extends Heap {constructor(list, comparator) {if (typeof comparator != 'function') {comparator = function comparator(inserted, compared) {return inserted > compared;};}super(list, comparator);}heapify(arr, size, i) {let smallest = i;const left = Math.floor(i * 2 + 1);const right = Math.floor(i * 2 + 2);if (left < size && this.comparator(arr[smallest], arr[left]))smallest = left;if (right < size && this.comparator(arr[smallest], arr[right]))smallest = right;if (smallest !== i) {[arr[smallest], arr[i]] = [arr[i], arr[smallest]];this.heapify(arr, size, smallest);}}
}

http://www.ppmy.cn/news/1195653.html

相关文章

thinkphp6 入门(11)-- 模板标签

新版框架默认只能支持PHP原生模板&#xff0c;如果需要使用thinkTemplate模板引擎&#xff0c;需要安装think-view扩展&#xff08;该扩展会自动安装think-template依赖库&#xff09;。 composer require topthink/think-view配置文件 安装完成后&#xff0c;在配置目录的vi…

[ubuntu]查看自己电脑硬件是否支持avx指令集

有时候paddlepaddle或者其他深度学习框架明显需要avx支持才能正常使用&#xff0c;因此知道电脑硬件是否支持avx很重要&#xff0c;那么怎么查看自己电脑是否支持avx指令集呢&#xff0c;很简单输入下面命令即可 grep -o -e sse4_2 -e avx -e sse4a -e avx2 /proc/cpuinfo

CC++动态内存分配与释放

C&C中内存分配分的方式有C语言方式和C方式两种&#xff0c;由于C兼容C&#xff0c;所以C的分配方式是可以 在C中使用。 C分配释放方式 在C中&#xff0c;动态内存分配和释放是通过使用new和delete关键字来完成的。 动态内存分配&#xff1a; 使用new关键字来分配动态内存…

C++ 模板特化

非类型模板参数 定义&#xff1a;对于函数模板和类模板&#xff0c;模板参数并不局限于类型&#xff0c;普通值也可以作为模板参数 非类型模板参数定义的是常量 template<typename T, size_t N> class array; //T&#xff1a;类型模板参数 //N&#xff1a;非类型模板参…

深入了解 CPU 的型号、代际架构与微架构

大家好&#xff0c;我是飞哥&#xff01; 在 10 月 16 号的时候&#xff0c;Intel 正式发布了第 14 代的酷睿处理器。但还有很多同学看不懂这种发布会上发布的各种 CPU 参数。借着这个时机&#xff0c;我给大家深入地讲讲 CPU 的型号规则、代际架构与微架构方面的知识。 CPU 在…

react_12

在异步操作里为状态属性赋值&#xff0c;需要放在 runInAction 里&#xff0c;否则会有警告错误 使用 store&#xff0c;所有使用 store 的组件&#xff0c;为了感知状态数据的变化&#xff0c;需要用 observer 包装&#xff0c;对应着图中 reactions import { Input } from …

基于RK3568的新能源储能能量管理系统ems

新能源储能能量管理系统&#xff08;EMS&#xff09;是一种基于现代化技术的系统&#xff0c;旨在管理并优化新能源储能设备的能量使用。 该系统通过监测、调度和控制新能源储能设备来确保能源的高效利用和可持续发展。 本文将从不同的角度介绍新能源储能能量管理系统的原理、…

windows server 2016调优

1. 增加TCP连接的最大数量&#xff1a; 在您当前的注册表路径&#xff08;HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters&#xff09;中的右侧窗格&#xff0c;右击空白处&#xff0c;选择“新建” -> “DWORD (32位) 值”。为新的值命名为TcpNu…