leetcode215题--数组中的第K个最大元素(JS排序方法大全)

js代码-数组中的第K个最大元素 立即下载

冒泡排序

var findKthLargest = function(nums, k) {
    for(let i = 0;i < nums.length - 1;i++){
        for(let j = 0; j < nums.length - i - 1;j++){
            if(nums[j] > nums[j+1]){
                var temp = nums[j];
                nums[j] = nums[j+1];
                nums[j+1] = temp;
            }
        }
    }
    nums.reverse();
    return nums[k-1];
};

选择排序

var findKthLargest = function(nums, k) {
    for(let i = 0;i < k;i++){
        var max = nums[i];
        let n = i;
        for(let j = i + 1; j < nums.length+1;j++){
            if(nums[j] > max){
                max = nums[j];
                n = j;
            }
        }
        if(n != i){
                let temp = nums[i];
                nums[i] = nums[n];
                nums[n] = temp;
            }
    }
    console.log(nums);
    return nums[k-1];
};

一行代码

var findKthLargest = function(nums, k) {
    return nums.sort((a,b)=>b-a)[k-1]
};

相当于调用

	 function sortNumber(a,b)
	 {
	 	return a - b
	 }
	 arr.sort(sortNumber)

sort() 方法用于对数组的元素进行排序,并返回数组。默认排序顺序是根据字符串Unicode,不是unicode是ascii。sort方法用于根据一定条件对数组元素进行排序。如果调用sort()方法时没有传递参数,则按字母顺序对数组中的元素进行排序;如果提供一个函数参数,则根据该函数提供的顺序来对数组中的元素进行排序。

  • 若 a 小于 b,在排序后的数组中 a 应该出现在 b 之前,则返回一个小于 0 的值。
  • 若 a 等于 b,则返回 0。
  • 若 a 大于 b,则返回一个大于 0 的值。

其实就是比较函数两个参数a和b,返回a-b 升序,返回b-a 降序。

堆栈法

构造前 k 个最大元素小顶堆,取堆顶
我们也可以通过构造一个前 k 个最大元素小顶堆来解决,小顶堆上的任意节点值都必须小于等于其左右子节点值,即堆顶是最小值。

所以我们可以从数组中取出 k 个元素构造一个小顶堆,然后将其余元素与小顶堆对比,如果大于堆顶则替换堆顶,然后堆化,所有元素遍历完成后,堆中的堆顶即为第 k 个最大值

具体步骤如下:

从数组中取前 k 个数( 0 到 k-1 位),构造一个小顶堆
从 k 位开始遍历数组,每一个数据都和小顶堆的堆顶元素进行比较,如果小于堆顶元素,则不做任何处理,继续遍历下一元素;如果大于堆顶元素,则将这个元素替换掉堆顶元素,然后再堆化成一个小顶堆。
遍历完成后,堆顶的数据就是第 K 大的数据

let findKthLargest = function(nums, k) {
    // 从 nums 中取出前 k 个数,构建一个小顶堆
    let heap = [,], i = 0
    while(i < k) {
       heap.push(nums[i++]) 
    }
    buildHeap(heap, k)
    
    // 从 k 位开始遍历数组
    for(let i = k; i < nums.length; i++) {
        if(heap[1] < nums[i]) {
            // 替换并堆化
            heap[1] = nums[i]
            heapify(heap, k, 1)
        }
    }
    
    // 返回堆顶元素
    return heap[1]
};

// 原地建堆,从后往前,自上而下式建小顶堆
let buildHeap = (arr, k) => {
    if(k === 1) return
    // 从最后一个非叶子节点开始,自上而下式堆化
    for(let i = Math.floor(k/2); i>=1 ; i--) {
        heapify(arr, k, i)
    }
}

// 堆化
let heapify = (arr, k, i) => {
    // 自上而下式堆化
    while(true) {
        let minIndex = i
        if(2*i <= k && arr[2*i] < arr[i]) {
            minIndex = 2*i
        }
        if(2*i+1 <= k && arr[2*i+1] < arr[minIndex]) {
            minIndex = 2*i+1
        }
        if(minIndex !== i) {
            swap(arr, i, minIndex)
            i = minIndex
        } else {
            break
        }
    }
}

// 交换
let swap = (arr, i , j) => {
    let temp = arr[i]
    arr[i] = arr[j]
    arr[j] = temp
}

快速排序

快速选择(quickselect)算法
无论是排序算法还是构造堆求解 Top k问题,我们都经过的一定量的不必要操作:

如果使用排序算法,我们仅仅想要的是第 k 个最大值,但对其余不需要的数也进行了排序
如果使用堆排序,需要维护一个大小为 k 的堆(大顶堆,小顶堆),时间复杂度也为 O(nlogk)
快速选择(quickselect)算法与思路上相似,我们先看看是如何实现的?

使用了分治策略的思想,所谓分治,顾名思义,就是分而治之,将一个复杂的问题,分成两个或多个相似的子问题,在把子问题分成更小的子问题,直到更小的子问题可以简单求解,求解子问题,则原问题的解则为子问题解的合并。

过程:

首先从序列中选取一个数作为基准数
将比这个数大的数全部放到它的右边,把小于或者等于它的数全部放到它的左边 (一次partition)
然后分别对基准的左右两边重复以上的操作,直到数组完全排序
具体按以下步骤实现:

  1. 创建两个指针分别指向数组的最左端以及最右端
  2. 在数组中任意取出一个元素作为基准
  3. 左指针开始向右移动,遇到比基准大的停止
  4. 右指针开始向左移动,遇到比基准小的元素停止,交换左右指针所指向的元素
  5. 重复3,4,直到左指针超过右指针,此时,比基准小的值就都会放在基准的左边,比基准大的值会出现在基准的右边
  6. 然后分别对基准的左右两边重复以上的操作,直到数组完全排序
    注意这里的基准该如何选择:最简单的一种做法是每次都是选择最左边的元素作为基准,但这对几乎已经有序的序列来说,并不是最好的选择,它将会导致算法的最坏表现。还有一种做法,就是选择中间的数或通过 Math.random() 来随机选取一个数作为基准,下面的代码实现就是以随机数作为基准
var findKthLargest = function (nums, k) {
    let start = 0, end = nums.length - 1;
    // 排好序后,数组中第key个元素就是第K大的元素
    let key = nums.length - k;
    while (true) {
        let i = partition(nums, start, end);
        if (i === key) {
            return nums[key];
        } else if (i < key) {
            // 说明要找的值比nums[i]要大,所以要在[i+1, end]中继续切分
            start = i + 1;
        } else {
            // 说明要找的值比nums[i]要小,所以要从[0, i-1]中继续切分
            end = i - 1;
        }
    }
};
function partition(arr, start, end) {
    // 找出中间值与起始值交换位置,再用起始值做pivot值,防止顺序数组与倒序数组。
    if (end > start) {
        swap(arr, start, start + Math.floor((end - start) / 2));
    }
    // j 记录pivot值最终在数组中的索引(也表示比pivot小的元素的个数)
    let pivot = arr[start], j = start;
    
    // 从start+1开始到end结束
    for (let i = start + 1; i <= end; i++) {
        // 将比pivot小的都放到pivot前面去
        if (arr[i] < pivot) {
            // 当有一个比pivot小的值就将pivot值最终索引j + 1
            if(++j === i) continue // 如果j+1 后与i相等,则直接跳过,索引相同不需要交换
            swap(arr, i, j);
        }
    }
    // 循环完了之后,索引j和j之前的元素都是比pivot小的,j就是pivot所在数组中最终的索引
    // 循环完成后交换pivot和arr[j]的位置
    swap(arr, start, j);
    return j;
}
function swap(ary, i, j) {
    let temp = ary[i];
    ary[i] = ary[j];
    ary[j] = temp;
}
吊打BEVFormer!GaussianBeV实战:用3D高斯开启BEV分割新范式 GaussianBeV是一种基于3D高斯建模的BEV分割新方法,在自动驾驶感知任务中实现了SOTA性能。其核心创新在于将场景元素表示为3D高斯分布,通过均值、协方差和权重精确描述物体位置、形状和置信度,相比传统BEV方法具有更强的空间建模能力。文章详细介绍了GaussianBeV的原理、环境配置、训练推理流程及其在自动驾驶和城市3D重建中的应用,并讨论了优化方向和未来发展趋势。该方法在nuScenes等数据集上表现出色,为BEV分割任务提供了新的解决方案。 阅读详情

相关推荐

别再为数据发愁了!盘点5个公开可用的医学图像数据集(含MRI/CT/PET合成任务)

本文详细介绍了5个高质量的公开医学图像数据集,涵盖MRI、CT和PET三大模态,适用于深度学习模型训练和医学图像合成任务。每个数据集均提供下载指南、预处理技巧和PyTorch加载示例,帮助研究人员快速获取和处理数据,解决医学AI开发中的数据瓶颈问题。

weixin_30689307的博客 524

215. 数组中的第K个最大元素 JavaScript实现

215. 数组中的第K个最大元素 一、topk问题 考察的核心是可以进行topk排序算法。解决topk问题的排序算法有快速排序、堆排序。 二、python知识 1、运算符 // // 取整除 - 返回商的整数部分(向下取整) 2、对于堆而言,确定最后一个非叶子节点的根节点 :(n-2)//2 (若叶子节点为i,则他的父节点为(i-1)//2 ) 3、for i in range 实现100 - 1 倒序遍历 //第三个参数表示的是100所有进行的操作,每次加上-1,直到0 for i in range(10

weixin_43466639的博客 1980

实战指南:如何优雅解决SpringBoot3与Mybatis-Plus的版本兼容性问题

本文深入解析SpringBoot3与Mybatis-Plus的版本兼容性问题,提供实战解决方案。通过Maven依赖排除策略、Gradle配置方案及自动配置覆盖策略,有效解决包冲突和初始化顺序问题,确保项目平稳升级。适用于开发者快速解决SpringBoot3与Mybatis-Plus的集成难题。

weixin_28432777的博客 597

寻找数组中的第K大的元素&找数组中重复数字

问题1:寻找数组中的第K大的元素。public class FindMaxKNum { public static void main(String args[]) { int a[] = new int[]{3,5,2,8,-1,7,1,10}; System.out.println(findKMaxNum(a, 0, a.length - 1, 6));

Jack Cheung 757

电路设计学习一:DAC/ADC原理

文章目录参考文献DAC基本原理DAC分类倒T型电阻网络权电流转换器DAC的性能指标分辨率转换速度ADC基本原理ADC分类ADC的性能指标ADC的位数分辨率基准源转换速率量化误差 参考文献 DAC数模转换/ADC模数转换 单片机 AD/DA数模转换 模数转换(A/D)与数模转换(D/A) DAC基本原理 DAC将输入的数字量按权的大小,通过电阻网络转化为模拟量,再通过加法电路,转换为与数字量成比例的模拟量。 实际上就是二进制转换为十进制的过程。 基本组成包括锁存器、电子开关、基准源、权电阻网络和求和电路。 锁

coin的博客 3万+

利用Spm12进行fMRI数据分析:从预处理到结果解读的完整指南

本文提供了利用SPM12进行fMRI数据分析的完整流程指南,涵盖从数据预处理、统计建模到结果解读的全过程。详细介绍了在MATLAB环境下使用SPM12图形界面完成头动矫正、空间标准化等关键步骤的操作方法与避坑技巧,帮助神经科学研究者和心理学研究者高效处理功能磁共振成像数据并产出可靠结果。

weixin_29079671的博客 452

AB有序数组长度可以不同,元素可以重复,求第k大

问题:给定一个有序(非降序)数组A和一个有序(非降序)数组B,可含有重复元素,求两个数组合并结果中的第k(k>=0)个数字。 这个题目出现了两个数组,有序的,不管怎样我们就应该首先考虑二分查找是否可行。若使用顺序查找,时间复杂度最低为O(k),就是类似归并排序中的归并过程。使用用二分查找时间复杂度为O(logM+logN)。二分查找的具体实现过程请参考实现代码与注释。 [cpp

计算机的艺术 952

【低空经济】无人机充电站设计方案

随着无人机技术的快速发展和广泛应用,其在物流、农业、巡检、救援等领域的应用日益普及。然而,无人机的续航能力一直是限制其大规模应用的关键因素之一。为了解决这一问题,无人机充电站的设计与建设显得尤为重要。本项目旨在设计一套高效、智能、可扩展的无人机充电站系统,以满足不同场景下无人机的充电需求,提升其作业效率和应用范围。无人机充电站的设计将围绕以下几个核心目标展开:首先,充电站应具备快速充电能力,以减少无人机的停机时间,提高作业效率;

2960

JS算法题:找到数组中第 k 大的元素

给定一个未排序的整数数组,找到其中第 k 大的元素。

weixin_44510200的博客 633

互联网人提高效率必备软件合集

很多的时候我们解决不了问题,只是因为没有找到对的工具,实际上,很多好的工具就在那里,只是你不用而已。这点上,信息壁垒是一个很大的原因,因此我希望兄伙伴们多出去走走,不要只是局限在一个圈层;

zhonglunshun的专栏 3484

2026年医疗AI的可信革命全栈实现(上)

医疗AI可信化:贝叶斯网络与向量数据库的协同架构 本文探讨2026年医疗AI发展的关键转折点——从追求生成能力转向构建可信决策系统。核心观点认为,医疗AI下一阶段的竞争焦点在于不确定性量化和错误传播约束,而非单纯的问答流畅度。研究提出以Python为开发语言、结合向量数据库与贝叶斯网络的混合架构: 技术分层 语言层(LLM):处理自然语言交互与工具调用 证据层(Milvus/Qdrant):实现可审计的临床知识检索 概率层(pgmpy/PyMC):执行贝叶斯推理与风险路由 治理层:确保权限控制与人工复核机制

AllenLV的博客 1152

【JavaScript 题解】215. 数组中的第K个最大元素(冒泡+快排+堆排)

使用冒泡排序、快速排序、堆排序解决 “数组中的第K个最大元素” 问题,一题多解,复习多种排序算法。

StarkerRegen的博客 922

解决 maven编译项目-Fatal error compiling: 无效的目标发行版: 21 -> [Help 1]

惊奇的发现,maven没有用环境变量中设置好的JAVA_HOME目录,至此发现错误原因,原来执行java -version默认使用系统环境变量JAVA_HOME,而maven优先使用了windows的用户变量JAVA_HOME(这里之前忘记修改,仍然指向java8路径),修改用户变量JAVA_HOME指向java21或删除该用户变量JAVA_HOME(如无它用)后即可。打开maven包所在的目录,在maven的配置文件 mvn.cmd 文件中,设置java_home的目录。

litlit023的专栏 1800

LeetCode 215:数组中的第K个最大元素 - 两种高效解法详解

在算法面试中,查找数组中第K个最大元素是一个经典问题。LeetCode第215题要求我们在未排序的数组中找到第K大的元素。本文将介绍两种高效的解决方案:快速选择算法和堆(优先队列)方法,帮助你全面掌握这道高频面试题。

weixin_44435110的博客 1627

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

力扣215.数组中第K大元素(堆排序、快排序)[javaScript]

将无序序列构建成一个堆,根据升序降序需求选择大顶堆将堆顶元素与末尾元素交换,将最大元素「沉」到数组末端重新调整结构,使其满足堆定义,然后继续交换堆顶与当前末尾元素,反复执行调整、交换步骤,直到整个序列有序。

xiang8766的博客 1333

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

【每日算法】LeetCode215. 数组中的第K个最大元素

摘要: 本文探讨了前端开发者学习算法的必要性,并以LeetCode215题(数组中的第K个最大元素)为例,分析三种解法: 直接排序法:排序后取第K个元素(O(n log n)),简单但效率低 最小堆法:维护大小为K的最小堆(O(n log k)),适合处理数据流 快速选择法:基于快速排序分区思想(平均O(n)),通过随机化避免最坏情况,为最优解。 文章结合前端场景(如排行榜、性能监控)说明算法实际价值,强调算法能力能帮助开发者从功能实现者进阶为系统设计者。

LYFlied的博客 977

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【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 ≤ 数组的长度。 解题思路 最直接的思路就是对数组进行排序,然后直接返回排序后数组的倒数第k个元素。 除了使用sort()方法直接对数组进行排序之外,我们还

公众号:前端充电宝 2163

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

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

底层码农 6224

leetcode215:js实现数组中的第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 const array = [3, 2, 1, 5, 6, 4]; const K = 2; // 第...

sinat_41747081的博客 1145

【算法-LeetCode】215. 数组中的第K个最大元素(暴力sort;快速排序)

LeetCode215. 数组中的第K个最大元素 发布:2021年7月29日17:34:28 问题描述及示例 给定整数数组 nums 和整数 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 来源:力扣(LeetCode) 链接:https://leetcode-cn

赖念安的博客 397

LeetCode 215:数组中的第 K 个最大元素,别排序了,快选才是正解!

本文介绍了如何在时间复杂度O(n)内找到数组中第k大的元素。通过对比直接排序(O(nlogn))的不足,重点讲解了快速选择算法(QuickSelect)及其三路划分优化方法。文章详细解析了算法核心思想、代码实现步骤和边界条件处理,强调随机选择pivot的重要性以避免最坏情况。关键点包括:将问题转化为寻找降序排列后的目标下标、三路划分处理重复元素、以及通过递归缩小搜索范围。最终代码在平均O(n)时间内解决问题,比完整排序更高效,特别适合大数据量场景。

2501_93411574的博客 579

数组中的第k个最大元素—leetcode215

在未排序的数组中找到第 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 ≤ 数组的长度。 解法一:冒泡排序,从后往前排,复杂度O(kn) class Solution { public: int findKthL...

独行侠 298

【leetcode】215.数组中第k个最大元素js

本文讨论了寻找数组中第k大元素的算法实现。首先给出了直接排序的简单解法,时间复杂度为O(nlogn)。然后引入快速选择算法,通过分区操作将时间复杂度优化到O(n)。针对快速选择在处理重复元素时可能退化为O(n²)的问题,提出了三路划分(荷兰国旗)的改进方案,将数组分为小于、等于和大于基准值三部分,有效解决了重复元素导致的性能问题。文章展示了从朴素解法到优化解法的完整思考过程,并附有JavaScript实现代码。

2402_83244812的博客 357

215. 数组中的第K个最大元素(JS实现)

1 题目 在未排序的数组中找到第 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 ≤ 数组的长度。 链接:https://leetcode-cn.com/problems/kth-largest-element-in-an-array 2

zjw_python的博客 984

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 ≤ 数组的长度。 Js1 用sort API来解决:...

eswang的优快云博客 155

LeetCode面试题:数组中的第K个最大元素(JavaScript)

215. 数组中的第K个最大元素(题目). 尝试了很多方法,主要是为了进行一个结果的对比。提交结果如下(从上到下): 堆排序:构造k个元素的小根堆 堆排序:构造nums.length个元素的小根堆 堆排序:构造nums.length个元素的小根堆(一点bug忽略) 快速排序(优化) 快速排序 直接sort:时间超过所有JS提交代码90%+(强,但是面试最好自己写排序 方法1:直接sort var findKthLargest = function(nums, k) { if(!nums.length)

Upxuans的博客 943
上一篇: Node.js中的MySQL模块化开发——数据库访问中的ORM(sequelize模块的使用)
下一篇: jQuery 简介
impact_factor
博客等级 码龄6年 32粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值