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

LeetCode——215,数组中的第K个最大元素(分治法) /** * \* Created: liuhuichao * \* Date: 2020/1/27 * \* Time: 11:32 上午 * \* Description: 数组中的第K个最大元素 * \ * 在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。 * <p> * 示例 1: * ... 阅读详情

题目

给定整数数组 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

题解一 堆排序

var findKthLargest = function(nums, k) {
   let heapSize=nums.length
    buildMaxHeap(nums,heapSize) // 构建好了一个大顶堆
    // 进行下沉 大顶堆是最大元素下沉到末尾
    for(let i=nums.length-1;i>=nums.length-k+1;i--){
        swap(nums,0,i)
        --heapSize // 下沉后的元素不参与到大顶堆的调整
        // 重新调整大顶堆
         maxHeapify(nums, 0, heapSize);
    }
    return nums[0]
   // 自下而上构建一颗大顶堆
   function buildMaxHeap(nums,heapSize){
     for(let i=Math.floor(heapSize/2)-1;i>=0;i--){
        maxHeapify(nums,i,heapSize)
     }
   }
   // 从左向右,自上而下的调整节点
   function maxHeapify(nums,i,heapSize){
       let l=i*2+1
       let r=i*2+2
       let largest=i
       if(l < heapSize && nums[l] > nums[largest]){
           largest=l
       }
       if(r < heapSize && nums[r] > nums[largest]){
           largest=r
       }
       if(largest!==i){
           swap(nums,i,largest) // 进行节点调整
           // 继续调整下面的非叶子节点
           maxHeapify(nums,largest,heapSize)//调整不了就不调了
       }
   }
   function swap(a,  i,  j){
        let temp = a[i];
        a[i] = a[j];
        a[j] = temp;
   }
};

笔记:

  1. 堆排序:

    基本思想
    将待排序序列构造成一个大顶堆

    注意:这里使用的是数组,而不是一颗二叉树

    此时:整个序列的 最大值就是堆顶的根节点

    将其 与末尾元素进行交换,此时末尾就是最大值

    然后将剩余 n-1 个元素重新构造成一个堆,这样 就会得到 n 个元素的次小值。如此反复,便能的得到一个有序序列。

    • 顺序存储二叉树
      特点
      第 n 个元素的 左子节点 为 2n+1
      第 n 个元素的 右子节点 为 2
      n+2
      第 n 个元素的 父节点 为 (n-1)/2
      最后一个非叶子节点为 Math.floor(arr.length/2)-1
  2. 最后一个非叶子节点为 Math.floor(arr.length/2)-1,先得到一个数组,构造成一棵树,从最后一个非叶子节点开始,跟两个子节点比较大小,将大的那个放在父节点上,然后按顺序将前面的父节点的位置调整好,最后根节点就是最大的。取第二大的节点,将根节点与最后一个子节点交换,然后将最后一个子节点去除,再将树重排一遍,这时新的根节点就是第二大的节点。

题解二 快排

let findKthLargest = function(nums, k) {
    return quickSelect(nums, nums.length - k)
};

let quickSelect = (arr, k) => {
  return quick(arr, 0 , arr.length - 1, k)
}

let quick = (arr, left, right, k) => {
  let index
  if(left < right) {
    // 划分数组
    index = partition(arr, left, right)
    // Top k
    if(k === index) {
        return arr[index]
    } else if(k < index) {//都要有return!!!
        // Top k 在左边
        return quick(arr, left, index-1, k)
    } else {
        // Top k 在右边
        return quick(arr, index+1, right, k)
    }
  }
  return arr[left]
}

let partition = (arr, left, right) => {
  // 取中间项为基准
  var datum = arr[Math.floor(Math.random() * (right - left + 1)) + left],
      i = left,
      j = right
  // 开始调整
  while(i < j) {
    // 左指针右移
    while(arr[i] < datum) {
      i++
    }
    // 右指针左移
    while(arr[j] > datum) {
      j--
    }
    // 交换 如果提前停下说明arr[i]>arr[j] 需要交换
    if(i < j) swap(arr, i, j)
    // 当数组中存在重复数据时,即都为datum,但位置不同
    // 继续递增i,防止死循环
    if(arr[i] === arr[j] && i !== j) {
        i++
    }
  }
  return i
}

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


var findKthLargest = function(nums, k) {
   return quickSort(nums,0,nums.length-1,nums.length-k)
};
let quickSort = (arr,left,right,k)=>{
    let index;
    if(left<right){
        index=partition(arr,left,right)
        if(index === k){
            return arr[index]
        }else if(k<index){
            quickSort(arr,left,index-1,k)
        }else{
            quickSort(arr,index+1,right,k)
        }
    }
    return arr[left];
}
let partition = (arr,left,right)=>{
    let dataRad=arr[Math.floor(Math.random()*(right-left+1))+left],i=left,j=right
    while(i<j){
        while(arr[i]<dataRad){i++}
        while(arr[j]>dataRad){j--}
        if(i<j){swap(arr,i,j)}
        if(arr[i]===arr[j]&&i!==j){
            i++
        }
    }
    return i
}
let swap = (arr, i , j) => {
    let temp = arr[i]
    arr[i] = arr[j]
    arr[j] = temp
}

笔记:

  1. 快排,分区,partition

    其实没有必要全部排序,可以利用快速排序的 partition 操作,找到第 K 个最大元素。

    每进行一次快速排序的 partition 操作,就能找到这次我们选中的基准值排序之后的正确位置。

    如果它的位置刚好是排序之后第 K 个最大元素的位置,即 len - k,我们直接得到了答案;
    因为进行 partition 操作之后,位于基准值之前的元素都要小于基准值,位于基准值之后的元素都要大于等于基准值。

    如果它的位置小于排序之后第 K 个最大元素的位置,我们就去它之后寻找第 K 个最大元素;
    如果它的位置大于排序之后第 K 个最大元素的位置,我们就去它之前寻找第 K 个最大元素;

  2. 我们仅仅需要在每执行一次的时候,比较基准值位置是否在 n-k 位置上,如果小于 n-k ,则第 k 个最大值在基准值的右边,我们只需递归基准值右边的子序列即可;如果大于 n-k ,则第 k 个最大值在基准值的做边,我们只需递归***基准值左边的子序列即可;如果等于 n-k ,则第 k 个最大值就是基准值

外贸英文函电第三版张梅英课后习题答案解析 我参加了一些外贸模拟竞赛,将所学知识运用到实际工作中,取得了不错的成绩。此外,我还积极参与了一些外贸实践活动,如参加实习、担任志愿者等,从中积累更多的经验。在这个过程中,我逐渐摸索出了一套适合自己的学习方法,不仅提高了学习效果,还增强了自信心。通过学习这本书,我们可以提高自己在外贸领域的沟通能力,更好地应对未来的工作挑战。在学习这本书的过程中,我遇到了一些困难,比如对某些专业术语的理解不够透彻,对信件的结构和格式掌握不够熟练。出版社: 高等教育出版社。上传者: ʚ河西撒手没ɞ。 阅读详情

相关推荐

EPICS Phoebus安装指南:从零构建到跑通第一个PV

在工业控制与加速器控制领域,上位机界面的选型往往决定整套系统的可维护性。EPICS作为分布式控制系统的核心中间件,其生态中的显示层工具近年正从老旧的CSS迁移至官方继任者Phoebus。Phoebus基于模块化架构,依赖JDK 17与Maven构建,通过Display Builder、PV Tree等应用实现PV数据的可视化与操作。对于刚接触EPICS的工程师,理解PV概念、Channel Access通信模型以及软IOC的搭建,是掌握Phoebus落地的基础。本文从环境准备、源码构建、启动连接软IOC到高

weixin_33874713的博客 513

Leetcode215-数组中的第K个最大元素

数组中的第K个最大元素 给定整数数组 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 解题思路:要返回一个乱序数组的第k大元素,首先对数组进行排序.对数组排序好之后,可以直接取数组下标第k大的元素.这里考虑使用快速排序对数组进行排序. class S

weixin_43586713的博客 266

CGNS快速入门到实战(二):VS配置调用CGNS静态链接库

CGNS快速入门到实战这一系列分成三篇文章展开叙述,具体有:(一)CGNS静态链接库编译;(二)VS配置调用CGNS静态链接库;(三)CGNS文件及案例展示。本篇文章重点讲述VS配置调用CGNS静态链接库。

ahang_99的博客 2618

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

0215.数组中的第K个最大的元素 描述 在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。 实例 输入: [3,2,1,5,6,4] 和 k = 2 输出: 5 输入: [3,2,3,1,2,4,5,5,6] 和 k = 4 输出: 4 说明 你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。 题解 直接使用...

wjoker的博客 310

VM与欧姆龙PLC通讯设置:Fins TCP/UDP协议实战避坑指南

本文详细解析了VM视觉平台与欧姆龙PLC通过Fins TCP/UDP协议进行通讯的实战配置与避坑要点。文章对比了Fins TCP与Fins UDP的差异,推荐在多数工业控制场景下优先选用Fins TCP以保证可靠性,并深入讲解了网络设置、寄存器地址映射、轮询优化等核心配置步骤。同时,针对常见的多次触发拍照、数据解析错误等问题提供了具体的解决方案和调试技巧,旨在帮助工程师快速建立稳定高效的通讯连接。

e4f5g6h7的博客 597

【BLE】SIG-蓝牙技术联盟:会员特权与BQB认证全解析

本文全面解析了蓝牙技术联盟(SIG)的核心角色与BQB认证流程。详细阐述了SIG会员(应用会员与联盟会员)的不同特权、成本结构及法律协议,并提供了从准备到完成的BQB认证实战指南,帮助企业合规使用蓝牙技术并规划长期商业价值。

game4的博客 608

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

215. 数组中的第K个最大元素 给定整数数组 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 class Solution { public int findKthLargest(int[] nums, int k) { i

pukka的博客 153

基于STM32L4XX、HAL库的STS40-CD1B-R3温度传感器 驱动程序设计

/ HAL库需要左移一位。// 每2秒读取一次。// 等待测量完成 - 高精度模式大约需要15ms。// 执行软复位确保传感器处于已知状态。温度测量范围:-40°C ~ +125°C。湿度测量范围:0% ~ 100% RH。// 复位后需要等待至少1ms。// 初始化STS40传感器。// 读取温湿度数据。// 转换原始数据为实际值。// 发送读取序列号命令。// 读取序列号数据。湿度精度:±1.5% RH。

zhusl6688的博客 288

Leetcode.0215 | 数组中的第K个最大元素

题目 给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。 请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。 示例 输入: [3,2,1,5,6,4] 和 k = 2输出: 5 输入: [3,2,3,1,2,4,5,5,6] 和 k = 4输出: 4 解决方法 使用堆排序解决此问题。首先在原地建立一个,做 k - 1次删除操作后堆顶元素就是我们要找的答案。 根据初始数组,手动构建大根堆。大根堆的本质是一棵完全二叉树,所有的父结点

畅春园 525

基于STM32、HAL库的RN8209D电能计量芯片驱动程序设计

/ 假设电压互感器变比为220V:0.5V,电流互感器变比为20A:5mA。// 电压ADC原始值。// 电流ADC原始值。// 有功功率(W)// 电能(kWh)

corlin6688的博客 472

【Claude】Not logged in · Please run /login 报错已解决

意味着 Claude Code 没有找到任何有效凭证。直接/login——交互式首选;检查——排查环境变量污染;CI 用——自动化场景标准方案;macOS Keychain 异常——/logout/login重置;时钟偏差——校准系统时间。参考:Claude Code 官方《错误参考》"身份验证"章节、官方认证优先级文档、社区 Token 过期排查记录。

博客 9999

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

Leetcode 215. 数组中的第K个最大元素1、问题分析2、问题解决3、总结 1、问题分析 题目链接:https://leetcode-cn.com/problems/kth-largest-element-in-an-array/   可以使用最小堆解决。代码我已经进行了详细的注释,理解应该没有问题,读者可以作为参考,如果看不懂(可以多看几遍),欢迎留言哦!我看到会解答一下。 2、问题解决   笔者以C++方式解决。 #include "iostream" using namespace std;

珍惜 8947

RFC 字符码转换深度解析:Unicode、非 Unicode 与 MDMP 系统的协奏

老版本 MDMP 系统不上传自定义映射时,Unicode 端会落回“预配置列表”。列表里可见西欧 1100、日文 8000、中文 8400 等经典编号。若需强制覆写映射,可在 SM59 ➡Unicode页签启用,或直接勾选作为兜底。字符编码问题常“潜伏”多年,一旦旧系统升级或新增语种便集中爆发。掌握 RFC code page 转换机理、灵活运用 SM59 选项、在早期对 LANG 字段和字段长度进行治理,是根治乱码与 short dump 的关键。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 227

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

一、前言 分类:Divide and Conquer。 问题来源LeetCode 215 难度:中等。 问题链接:https://leetcode-cn.com/problems/kth-largest-element-in-an-array/ 二、题目 在未排序的数组中找到第k个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。 示例1: 输入: [3,2,1,5,6,4] 和 k = 2 输出: 5 示例2: 输入: [3,2,...

行走 301

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

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

LeetCode 215 数组中的第K个最大元素 Java题目描述代码 题目描述 在未排序的数组中找到第 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 总是...

qq_29061435的博客 222

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

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

Leetcode笔记目录 215. 数组中的第K个最大元素 MediumLeetcode笔记目录一、题目描述二、解题过程1.思想2.代码三、总结 一、题目描述 在未排序的数组中找到第 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 二、解题过程 1.思想 TOPK问题,有很多种解法,如

zhuiguang3494的博客 199

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

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

划分,对于测试未通过的案例,即为一个极端案例。【该题leetcode的官方题解非常清晰,建议仔细阅读。为同一种算法代码实现,提交均为超出时间限制,未通过测试案例均为同一个,的大小关系将要排序的数据分成独立的两个部分,其中一部分的所有数据都比。元素,则已经找到答案,而不用关心左右两个区间中的数字是否有序。该题代码开发工作量略大,主要是边界问题的处理具体。中忽略了子区间仅为两个元素的情况,故造成错误;在左区间,则递归左区间,否则递归右区间。具体的,在实现过程中,若该位置。大),另外一部分的所有数据比。

用魔法打败魔法,走楼梯啊! 1080

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

LeetCode 215数组中的第K个最大元素 题目简述:在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。 输入:[3,2,1,5,6,4] 和 k = 2 输出:5 输入:[3,2,3,1,2,4,5,5,6] 和 k = 4 输出:4 思路一:利用STL大根堆维护数组元素,将前k-1个元素从大根堆中弹出,栈顶元素就是K大值 class Solution { public: int findKth

XBlog 168

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

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个元素即可 代码 int findKthLargest

weixin_43750513的博客 292

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

[LeetCode] 215.数组中的第K个最大元素 难度:Medium 题意: 思路: 方法一:快排,根据partition的结果对左右区间进行递归计算 class Solution { public: int partition(vector<int>& nums, int left, int right){ // 随机在 [left, right] 中, 选择一个数值作为标定点 pivot swap(nums[left], nums[ra

WchStrife的博客 206

力扣第215题“数组中的第K个最大元素”

本文详细解读了力扣第215题“数组中的第K个最大元素”,通过使用快速选择算法和堆排序的方法高效地解决了这一问题,并提供了详细的解释和模拟面试问答。希望读者通过本文的学习,能够在力扣刷题的过程中更加得心应手。

10年数据\经营分析经验,现任大厂数据分析负责人 1041

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

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 ≤ ...

sdm12345的博客 181

LeetCode第215题_数组中的第K个最大元素

LeetCode 第215题要求找到数组中第K个最大的元素,且需设计时间复杂度为O(n)的算法。常见解法包括快速选择算法和堆排序。快速选择算法基于快速排序,通过选取基准元素将数组分为两部分,递归查找第K大元素,平均时间复杂度为O(n)。堆排序则使用最小堆维护K个最大元素,遍历数组后堆顶即为第K大元素,时间复杂度为O(n log k)。代码实现中,C#、Python和C++分别展示了快速选择和堆排序的解决方案。快速选择适用于通用场景,而堆排序在空间复杂度上更具优势。

qq_40263592的博客 1049

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

215 数组中的第K个最大元素 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/kth-largest-element-in-an-array 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 题目描述 在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元...

RS的博客 231
上一篇: 208-实现 Trie (前缀树)
下一篇: 221-最大正方形
codrab
博客等级 码龄10年 15粉丝 98原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

codrab

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值