快速排序找出第K大的元素

有序数组里第 K 大的元素就是index 为 array.length - k 的元素。
快速排序的思路主要就是选一个基准值p,然后将小于p的值放在p的左右,大于p的值放在p的右边,然后对左右数组进行递归。
利用这个思路,当我们找到这个基准值对应的 index,等于我们要找的index时,就可以了,不用管左右两边是否是有序的。

先看未优化版。这里是新建数组分别用来存比基准值小和大的元素

function findKthLargest(input, k) {
  const len = input.length;
  if (len < 2) return input;
  let nums = input.concat([]);

  const getQuickSortIndex = (startIndex, endIndex) => {
    const len = endIndex - startIndex + 1;
    const pivotIndex = (len >>> 1) + startIndex;
    const pivotValue = nums[pivotIndex];
    const leftArr = [];
    const rightArr = [];
    for (let i = startIndex; i <= endIndex; i++) {
      if (i === pivotIndex) continue; //不把基准值独立出来,会造成无限递归
      if (nums[i] <= pivotValue) {
        leftArr.push(nums[i]);
      } else {
        rightArr.push(nums[i]);
      }
    }
    nums.splice(startIndex,len,...[...leftArr, pivotValue, ...rightArr]) ;
    return startIndex + leftArr.length;
  };

  let targetIndex = nums.length - k;
  let start = 0,
    end = nums.length - 1;
  let index = getQuickSortIndex(start, end);
  while (index != targetIndex) {
    if (index > targetIndex) {
      end = index - 1;
    } else {
      start = index + 1;
    }
    index = getQuickSortIndex(start, end);
  }
  return nums[index];
}

然后看优化版,不新建数组,直接在原数组上操作
在这里插入图片描述

function getQuickSortIndex(arr, startIndex, endIndex) {
  let pivot = arr[startIndex];
  let prev = startIndex;
  for (let i = startIndex + 1; i <= endIndex; i++) {
    if (arr[i] < pivot) {
      prev++;
      [arr[prev], arr[i]] = [arr[i], arr[prev]];
    }
  }
  arr[startIndex] = arr[prev];
  arr[prev] = pivot;
  return prev;
}

function findKthLargest_1(nums, k) {
  const len = nums.length;
  if (len < 2) return nums;

  let targetIndex = nums.length - k;
  let start = 0,
    end = nums.length - 1;
  let index = getQuickSortIndex(nums, start, end);
  while (index != targetIndex) {
    if (index > targetIndex) {
      end = index - 1;
    } else {
      start = index + 1;
    }
    index = getQuickSortIndex(nums, start, end);
  }
  return nums[index];
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/599702.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【教学类-50-14】20240505“数一数”图片样式12:数一数(12个“人物”图案)

作品展示 背景需求&#xff1a; 前文做了“”材料”图片的数一数学具&#xff0c;效果不错&#xff0c; https://blog.csdn.net/reasonsummer/article/details/138466325https://blog.csdn.net/reasonsummer/article/details/138466325 为了让图案内容更丰富&#xff0c;我又…

Python Dash库:一个Web应用只需几行代码

大家好&#xff0c;在数据科学领域&#xff0c;数据可视化是将数据以图形化形式展示出来&#xff0c;帮助我们更直观地理解数据。Python中有一个非常流行的数据可视化库叫做Dash&#xff0c;Dash以其简洁、高效和强大的功能而闻名&#xff0c;它允许开发者快速构建交互式Web应用…

【智能算法】人类进化优化算法(HEOA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献5.代码获取 1.背景 2024年&#xff0c;J Lian受到人类进化启发&#xff0c;提出了人类进化优化算法&#xff08;Human Evolutionary Optimization Algorithm, HEOA&#xff09;。 2.算法原理 2.1算法思想 …

JavaWEB 框架安全:Spring 漏洞序列.(CVE-2022-22965)

什么叫 Spring 框架. Spring 框架是一个用于构建企业级应用程序的开源框架。它提供了一种全面的编程和配置模型&#xff0c;可以简化应用程序的开发过程。Spring 框架的核心特性包括依赖注入&#xff08;Dependency Injection&#xff09;、面向切面编程&#xff08;Aspect-Or…

Springboot项目学习之各组件的用法和逻辑结构

1.Controller层&#xff08;Controller&#xff09;&#xff1a; 也称为前端控制器或请求处理器&#xff0c;它是项目与用户交互的入口。Controller接收HTTP请求&#xff0c;解析请求参数&#xff0c;调用Service层处理业务逻辑&#xff0c;并返回响应给客户端。 Controller通…

IP证书能免费申请吗

IP SSL证书是一种数字证书&#xff0c;用于保护网络服务器和网络浏览器之间的通信。该证书是一种主要保护公网IP地址的专属信任SSL证书。 IP类型的SSL证书对于直接用IP地址传输数据的技术人员来说&#xff0c;十分重要&#xff01;无论是防洪还是防劫持还是数据加密都起到了关…

【C 数据结构-动态内存管理】4. 无用单元收集(垃圾回收机制)

文章目录 【 1. 问题描述与解决方法 】【 2. 中断回收机制 】 【 1. 问题描述与解决方法 】 问题描述 动态存储管理的运行机制可以概括为&#xff1a;当用户发出申请空间的请求后&#xff0c;系统向用户分配内存&#xff1b;用户运行结束释放存储空间后&#xff0c;系统回收内…

【FL常用插件#1】Ozone11臭氧的安装和使用

本文内容收集自互联网&#xff0c;仅供个人学习参考使用&#xff0c;不允许用于商业用途&#xff0c;造成的侵权行为与本文作者无关 安装 VST2、VST3、AAX和NKS是音频技术界常见的几种插件格式&#xff0c;它们在功能和兼容性上有所不同&#xff1a; VST2 (Virtual Studio Tec…

用户管理中心——数据库设计用户注册逻辑设计

用户管理中心——数据库设计&用户注册逻辑设计 规整项目目录1. 数据库自动生成器的使用实现基本的数据库操作&#xff08;操作user表&#xff09; 2. 注册逻辑的设计(1) 写注册逻辑(2) 实现(3) 测试代码 3. 遇到的问题 规整项目目录 utils–存放工具类&#xff0c;比如加密…

关系型数据库MySQL开发要点之多表设计案例详解代码实现

什么是多表设计 项目开发中 在进行数据库表结构设计时 根据数据模型和业务关系 会根据业务需求和业务模块之间的关系分析设计表结构 由于业务之间互相关联 所以表结构之间也存在着各种联系 主要分为以下三种 一对多 每个部门下是有多个员工的 但是一个员工只能归属一个部…

京东JD商品详情API返回值揭秘:精准掌握商品信息

在当今电子商务繁荣的时代&#xff0c;对于电商平台来说&#xff0c;提供准确、详尽的商品信息对于满足用户需求、提升购物体验至关重要。京东作为中国领先的电商平台&#xff0c;通过其开放的API接口&#xff0c;为开发者提供了获取商品详情的强大工具。本文将深入探讨京东JD商…

FastDFS-单机扩容

描述 周一上班收到用户反馈系统异常&#xff0c;紧急排查日志发现报错&#xff1a;FdfsServerException:错误:28&#xff0c;错误信息:没有足够的存储空间。 解决 根据异常信息判断是文件服务器可用内存不够了&#xff0c;首先登录文件服务器&#xff0c;使用df -h命令查看一…

GMS地下水数值模拟及溶质(包含反应性溶质)运移模拟技术

采用全流程模式将地下水数值模拟软件GMS的操作进行详细剖析和案例联系。不仅使学员掌握地下水数值模拟软件GMS的全过程实际操作技术的基本技能&#xff0c;而且可以深刻理解模拟过程中的关键环节&#xff0c;以解决实际问题能力。同时为满足环评从业人员进一步加强地下水数值模…

AF594-标记羊抗鼠免疫球蛋白(H+L),山羊抗小鼠IgG全长抗体已被交叉吸附在抗人IgG和人血清上,然后再偶联以小化交叉反应性

试剂介绍&#xff1a; AF594-标记羊抗鼠免疫球蛋白(HL)是荧光标记二抗&#xff0c;我们的山羊抗小鼠IgG全长抗体已被交叉吸附在抗人IgG和人血清上&#xff0c;然后再偶联以小化交叉反应性。 这种AF594标记的山羊抗小鼠IgG缀合物通过交叉吸附的山羊抗小鼠IgG全抗体与AF594 NHS酯…

应用层协议——HTTP协议

1. 认识HTTP协议 HTTP&#xff08;Hyper Text Transfer Protocol&#xff09;协议又叫做超文本传输协议&#xff0c;是一个简单的请求-响应协议&#xff0c;HTTP通常运行在TCP之上。 超文本的意思就是超越普通的文本&#xff0c;http允许传送文字&#xff0c;图片&#xff0c…

深入理解nginx http响应限速功能

目录 1. 引言2. 配置参数2.1 limit_rate 配置指令2.2 limit_rate_after 配置指令2.3 其他限速配置 3. 源码分析 1. 引言 在现代互联网应用中&#xff0c;服务器的性能和响应速度是至关重要的。为了保证服务器的稳定性和可靠性&#xff0c;限制客户端对服务器的访问速度是一项重…

Web实操(6),基础知识学习(24~)

1.[ZJCTF 2019]NiZhuanSiWei1 &#xff08;1&#xff09;进入环境后看到一篇php代码&#xff0c;开始我简单的以为是一题常规的php伪协议&#xff0c;多次试错后发现它并没有那么简单&#xff0c;它包含了基础的文件包含&#xff0c;伪协议还有反序列化 &#xff08;2&#x…

【数据结构】顺序表与ArrayList

一、什么是顺序表 概念&#xff1a;顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构&#xff0c;一般情况下采用数组存储。在数组上完成数据的增删查改。 如下图&#xff1a; 优点&#xff1a;访问速度比较快&#xff0c;在给定下标的情况下时间复杂度低至O(…

网络1--通信过程的理解

1.封装与解包 通信的过程就是不断的封装和解包的过程 封装即就是按照“应用”“传输” “网络” “链路” 层&#xff0c;封装给每一层都加上相应的包头&#xff08;每一层都有协议&#xff0c;&#xff09;解包就是接受到的包文被一层层去掉相对应的包头。 任何一层的协议都…

ATFX汇市:日本央行或3万亿干预,日元升值势头显著

​ATFX汇市&#xff1a;4月29日&#xff0c;USDJPY创出历史新高160.21&#xff0c;随后进入快速回落阶段。五个交易日&#xff0c;最低价触及151.86点&#xff0c;相比最高价暴跌835基点&#xff0c;约5.21%。同期的美元指数跌幅仅为0.96%&#xff0c;两者跌幅严重不匹配&#…
最新文章