当前位置: 首页 > news >正文

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

🍎道阻且长,行则将至。🍓

🌻算法,不如说它是一种思考方式🍀


算法专栏: 👉🏻123


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

  • 题目描述:给定整数数组nums和整数** k**,请返回数组中第 k 个最大的元素。
    请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。
  • 来源:力扣(LeetCode)
  • 难度:中等
  • 提示:
    1 <= k <= nums.length <= 105
    -104 <= nums[i] <= 104

本题也出现在剑指offer II: 076. 数组中的第 k 大的数字,不过测试案例更友好。

🌴解题

对于本题最常规的解法就是先大到小排序,然后返回第k个元素即可,时间复杂度越低越好。
对于友好的测试案例,也可以使用大小为k的数组进行一次目标变量存储前k大的数。

1.排序法

1.1冒泡排序

最简单的是冒泡排序,方法非常简单,使用两层循环进行逐一遍历,时间复杂度为O(n2)。参考:冒泡排序☝

1.2快速排序

在这个题目要求的==O(n)==时间复杂度,冒泡法是无法通过的,因此考虑快一点的排序算法:快速排序。(大到小为例)
快速排序最直观的理解就是每次选择的key元素(或者基准)经过一趟排序后放在了最终所在的位置,也就是左边大于key元素,右边小于key元素。于是数组被区分为了两个子区间,再继续在两个子区间用同样的方法。这也被称之为分治策略,就是把大的问题变成一个个小的问题,最后组合起来。
例如数组:{4,2,3,5,6,1},对于其中的一次排序:
在这里插入图片描述
我们选取第一个元素为了key,下一个为p,最后一个为q。step1.q向遍历,遇到大于key的元素的位置停下来,step2.p向遍历,遇到小于key的停下来,然后交换pq的元素值。一直重复直到pq相遇,与key交换结束:
在这里插入图片描述
这是其中一种方法,还有挖坑填数、快慢指针:

  • 挖坑填数
    挖坑填数就是在上一个方法的基础上来的,选择的key元素先出来,q指针往左走发现大于key时就把这个元素出来,到上一个坑里,于是新坑出现了;然后p向右走,遇到小于key的也出来,到上一个坑里,一直这样的过程,直到pq相遇,将key最后入这个坑里。(指针是一直向坑遍历

在这里插入图片描述

  • 快慢指针fast、slow
    前面两种方法的指针都是从两端向中间,该方法的指针都是从左至右:都是从key的下一位往右走,快指针每走一步都会判断其指向的元素是否大等于key,若小于则交换两个指针的元素,并且让慢指针移动1位;直到fast遍历完全,slow退回一步(预期的向前了一步),交换slow和key。

在这里插入图片描述

快速排序和冒泡排序解题code:

class Solution076 {public static int findKthLargest(int[] nums, int k) {//排序// bobosort(nums);//快速排序fastsort(nums);return nums[k-1];}private static void fastsort(int[] nums) {int left=0,right= nums.length-1;myquicksort(nums,left,right);}private static void myquicksort(int[] nums, int left, int right) {if(left>right)return;int key=partsort(nums,left,right);myquicksort(nums,left,key-1);myquicksort(nums, key+1, right);}private static int partsort(int[] nums, int left, int right) {int key=left;while(left<right){while(left<right&&nums[right]<=nums[key])right--;while(left<right&&nums[left]>=nums[key])left++;myswap(nums,left,right);}myswap(nums,key,left);return left;}private static void myswap(int[] nums, int left, int right) {int tem;tem=nums[left];nums[left]=nums[right];nums[right]=tem;}public static int[] bobosort(int[] nums){int tem;for (int i = 0; i < nums.length-1; i++) {for (int j = i+1; j < nums.length; j++) {if(nums[i]<nums[j]){tem=nums[i];nums[i]=nums[j];nums[j]=tem;}}}return nums;}}

1.3快速排序思想简化本题

在前面就发现,本题其实找到某个位置之后的一些步骤不需要进行了,例如我们找第8个大的数,在第1次找到第六个元素,那么第8大的元素必然是在后面部分,前面部分数组就可以不管了;当刚好找到第8个时直接返回就是我们的结果。这样可以大大减少搜索时间。

  • code:
class Solution {publicint findKthLargest(int[] nums, int k) {int key=0;int left=0;int right= nums.length - 1;quicksort1(nums,key,left,right,k-1);return nums[k-1];}private static void quicksort1(int[] nums, int key, int left, int right, int k) {if(left>right)return;key = partsort( nums,  key,  left,  right);if(key<k){quicksort1(nums,key+1,key+1,right,k);}else if(key==k){return;}else{quicksort1(nums,left,left,key-1,k);}}private static int partsort(int[] nums, int key, int left, int right) {int slow=key+1;int fast=key+1;int temp;while (fast<=right){if(nums[fast]>=nums[key]){temp=nums[slow];nums[slow]=nums[fast];nums[fast]=temp;slow++;}fast++;}slow--;temp=nums[key];nums[key]=nums[slow];nums[slow]=temp;return slow;}
}

在这里插入图片描述

2.大小为k数组

就是说使用一个大小为k的数组来存储遍历找到前k个最大的数,只需要遍历一遍数组,但是数组k的处理还是需要耗费时间的。

  • code:
class Solution076 {public static int findKthLargest(int[] nums, int k) {int[] numk = new int[k];int j=0;for (int i = 0; i < nums.length; i++) {if(i<k){numk[i]=nums[i];}else{j=findKless(numk);if(numk[j]<nums[i])numk[j]=nums[i];}}j=findKless(numk);return numk[j];}public static int findKless(int[] nums){int k=0;for (int i = 1; i < nums.length; i++) {if(nums[k]>nums[i])k=i;}return k;}
}

该方法只能通过剑指offer的案例:
t215
在这里插入图片描述
剑指offer:
在这里插入图片描述


🌵Bug本是code常态,通过才是稀缺的意外!🌷

在这里插入图片描述

返回第一页☝



☕物有本末,事有终始,知所先后。🍭

🍎☝☝☝☝☝我的CSDN☝☝☝☝☝☝🍓

相关文章:

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

&#x1f34e;道阻且长&#xff0c;行则将至。&#x1f353; &#x1f33b;算法&#xff0c;不如说它是一种思考方式&#x1f340;算法专栏&#xff1a; &#x1f449;&#x1f3fb;123 一、&#x1f331;215. 数组中的第K个最大元素 题目描述&#xff1a;给定整数数组nums和整…...

vue面试题(day06)

文章目录前言请谈谈WXML与标准的html的异同&#xff1f;请谈谈WXSS和CSS的异同&#xff1f;请谈谈微信小程序主要目录和文件的作用&#xff1f;请谈谈小程序的双向绑定和vue的异同&#xff1f;简单描述下微信小程序的相关文件类型&#xff1f;微信小程序有哪些传值(传递数据)方…...

22 k8s常用命令

一、k8s网络 service网络 pod网络 节点网络 》 svc、pod网络都是虚拟机网络&#xff0c;真实网络是节点网络 二、内核升级 因为coentos系统3.10存在一些bug&#xff0c;docker、kubernetes不稳定&#xff0c;建议升级到4.4版本以上 三、集群资源分类 名称空间级别&#xff1…...

基于ESP32做低功耗墨水屏时钟

基于ESP32做低功耗墨水屏时钟电子墨水屏概述ESP32实验低功耗电子时钟功能描述接线开发实验结果电子墨水屏 概述 电子墨水是一种革新信息显示的新方法和技术。和传统纸差异是电子墨水在通电时改变颜色&#xff0c;并且可以显示变化的图象&#xff0c;像计算器或手机那样的显示。…...

常见路由器开源系统(固件)简介

前段时间在折腾如何通过 SD-WAN 组网方式打通办公室和家里的异地局域网。需要用到路由器的静态路由表功能&#xff0c;但是遍历整个家用路由器市场几乎没有支持这个功能的路由器&#xff08;只有华硕 RT-AX57 有这个功能&#xff0c;但是成本超出了我的预算&#xff09;。所有就…...

HCIE-Cloud Computing LAB备考第二步:逐题攻破--第二题:FusionAccess-搭建FA实验环境之安装基础组件和初始化ITA组件

HCIE-Cloud Computing LAB备考第二步:逐题攻破–第二题:FusionAccess-思维导图+题目=建立逻辑 专业术语 名词描述备注FusionAccess华为推出的桌面云产品,是一种虚拟桌面应用,它主要通过在硬件上部署FusionAccess配套的软件基础上,虚拟化出相互隔离的桌面,用户通过瘦客户端…...

Android APP检查设备是否为平板

正文 Android APP判断设备是否为平板的三种方法&#xff1a; 通过屏幕尺寸判断。一般来说&#xff0c;平板电脑的屏幕尺寸比手机大很多&#xff0c;可以根据屏幕的长宽比和尺寸等信息来区分设备类型。通过屏幕像素密度判断。一般来说&#xff0c;平板电脑的屏幕像素密度比手机…...

MP:使用步骤、分页、queryWrapper

Mybatis-Plus 官网&#xff1a; MyBatis-Plus (baomidou.com) 1. 意义 mybatis-plus是一个插件&#xff0c;它不能单独使用&#xff0c;必须配合mybatis使用&#xff0c;作用是简化mybatis操作&#xff0c;通过使用MP提供的方法&#xff0c;自动生成SQL语句进行CRUD 2. 使用步骤…...

C++ string类

C string类讲解 1、为什么学习string类&#xff1f; C语言中的字符串 在C语言中&#xff0c;字符串是以’\0’结尾的一些字符的集合&#xff0c;为了操作方便&#xff0c;C标准库中提供了一些str系列的库函数&#xff0c;但是这些库函数与字符串是分离开的&#xff0c;不太符…...

虚拟机断电centos无法启动

虚拟机断电后centos7无法正常启动 XFS(sda3) 首先需要查找日志 在界面中查找日志是 journalctl 1.由于我的电脑死机&#xff0c;虚拟机没有正常关闭导致重启后 node1节点&#xff1a;可以登陆但是出现XFS(sda3)&#xff1a;Corruption of in-memoru data detectednode2节点&…...

python学习之基于Python的人脸识别技术学习

摘要&#xff1a; 面部识别技术的应用越来越广泛&#xff0c;它广泛应用于安全系统、人机交互、社交媒体、医疗保健等领域。本文介绍了基于Python的人脸识别技术&#xff0c;包括人脸检测、人脸特征提取和人脸识别三个部分。我们使用OpenCV和Dlib库来实现这些功能&#xff0c;…...

[Qt][Android] Qt for Android 环境搭建

建议使用 Linux 环境开发 Qt for Android&#xff0c;Windows 环境不好弄&#xff0c;问题多。 直接按照官方文档给的流程进行一步步做就行了&#xff1a; Getting Started with Qt for Android | Qt 6.4https://doc.qt.io/qt-6/android-getting-started.html建议使用 ubuntu…...

maven setting 配置

<?xml version"1.0" encoding"UTF-8"?><settings xmlns"http://maven.apache.org/SETTINGS/1.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/SETTINGS/1.0.0…...

【0基础学爬虫】爬虫基础之网络请求库的使用

大数据时代&#xff0c;各行各业对数据采集的需求日益增多&#xff0c;网络爬虫的运用也更为广泛&#xff0c;越来越多的人开始学习网络爬虫这项技术&#xff0c;K哥爬虫此前已经推出不少爬虫进阶、逆向相关文章&#xff0c;为实现从易到难全方位覆盖&#xff0c;特设【0基础学…...

超级实用,解密云原生监控技术,使用prometheus轻松搞定redis监控

前言 大家好&#xff0c;我是沐风晓月&#xff0c;本文收录于《 prometheus监控系列》 &#xff0c;截止目前prometheus专栏已经更新到第8篇文章。 本文中的是prometheus已经安装好&#xff0c;如果你还未安装&#xff0c;可以参考 prometheus安装及使用入门 若你想监控其他…...

音视频开发—MediaCodec 解码H264/H265码流视频

使用MediaCodec目的 MediaCodec是Android底层多媒体框架的一部分&#xff0c;通常与MediaExtractor、MediaMuxer、AudioTrack结合使用&#xff0c;可以编码H264、H265、AAC、3gp等常见的音视频格式 MediaCodec工作原理是处理输入数据以产生输出数据 MediaCodec工作流程 Med…...

CVPR 2023|淘宝视频质量评价算法被顶会收录

近日&#xff0c;阿里巴巴大淘宝技术题为《MD-VQA: Multi-Dimensional Quality Assessment for UGC Live Videos》—— 适用于无参考视频质量评价的最新研究成果被计算机视觉领域顶级会议IEEE/CVF Computer Vision and Pattern Recognition Conference 2023&#xff08;CVPR 20…...

【C++学习】继承

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《C学习》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; C是面向对象的编程语言&#xff0c;它有很多的特性&#xff0c;但是最重要的就是封装&#xff0c;继承…...

【03173】2020年8月高等教育自学考试-软件开发工具

一、单项选择题&#xff1a;1. 区别于一般软件&#xff0c;对软件开发工具而言&#xff0c;下列各项最重要的性能是 A. 效率 B. 响应速度C. 资源消耗 D. 使用方便2. 在软件开发过程的信息需求中&#xff0c;属于跨开发周期的信息是A. 有关系统环境的需求信息 B. 有关软件设计的…...

Java中的String类

String类1.String类1.1 特性1.2 面试题1.3 常用方法1.4 String与其他类型之间的转换2. StringBuilder类、StringBuffer类&#xff1a;可变字符序列1.String类 1.1 特性 String类为final类&#xff0c;不可被继承&#xff0c;代表不可变的字符序列&#xff1b; 实现了Serializ…...

DDrawCompat完整教程:Windows 11上经典游戏DirectDraw兼容性修复终极指南

DDrawCompat完整教程&#xff1a;Windows 11上经典游戏DirectDraw兼容性修复终极指南 【免费下载链接】DDrawCompat DirectDraw and Direct3D 1-7 compatibility, performance and visual enhancements for Windows Vista, 7, 8, 10 and 11 项目地址: https://gitcode.com/gh…...

HelmWave实战:声明式编排Kubernetes多Chart部署与GitOps集成

1. 项目概述&#xff1a;HelmWave&#xff0c;一个被低估的Helm编排利器如果你和我一样&#xff0c;长期在Kubernetes环境中管理着几十甚至上百个Helm Chart&#xff0c;那你一定对“Helm依赖地狱”和“多环境部署同步”这两个词深有感触。每次更新&#xff0c;手动执行一堆hel…...

OpenClaw AI代理成本监控:离线日志解析与Token用量分析实战

1. 项目概述与核心价值如果你和我一样&#xff0c;在日常工作中重度依赖像 OpenClaw 这样的 AI 代理框架来处理各种自动化任务&#xff0c;那么一个绕不开的“甜蜜的烦恼”就是成本监控。我们享受着 AI 带来的效率提升&#xff0c;但每次看到账单时&#xff0c;心里总会咯噔一下…...

ARM GICv3中断控制器与ICC_BPR1寄存器详解

1. ARM GICv3中断控制器架构概述在ARM架构的现代处理器中&#xff0c;通用中断控制器(GIC)是管理硬件中断的核心组件。GICv3作为当前主流的版本&#xff0c;相比前代架构进行了多项重要改进&#xff1a;支持更多处理器核心&#xff08;理论上可达128个PE&#xff09;改进的中断…...

CANN/ops-math Signbit算子文档

aclnnSignbit 【免费下载链接】ops-math 本项目是CANN提供的数学类基础计算算子库&#xff0c;实现网络在NPU上加速计算。 项目地址: https://gitcode.com/cann/ops-math &#x1f4c4; 查看源码 产品支持情况 产品是否支持Ascend 950PR/Ascend 950DT√Atlas A3 训练系…...

SQL与数据库开发(四):CASE WHEN 与“行转列/列转行”花式玩法

在企业级应用的开发中&#xff0c;后端程序员和报表工程师往往面临着一种天然的矛盾&#xff1a;“数据库的存储格式”与“前端的展示格式”是完全不匹配的。 关系型数据库最喜欢“瘦长”的表&#xff08;不断往下插入新行&#xff09;&#xff0c;而业务方和老板最喜欢看的是…...

Claude Code 完全指南:从零开始掌握 AI 编程助手

本指南适合对象:完全零基础的初学者、希望系统学习 Claude Code 的开发者、想要最大化利用 AI 辅助编程效率的技术人员。 阅读时间:预计 20-30 分钟完整阅读,实操学习 2-3 天。 文档版本:基于 Claude Code v2.1.x(2026年5月) 目录 Claude Code 完全指南:从零开始掌握 A…...

KMS_VL_ALL_AIO:基于微软官方协议的系统激活工具技术解析

KMS_VL_ALL_AIO&#xff1a;基于微软官方协议的系统激活工具技术解析 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO KMS_VL_ALL_AIO是一款基于微软KMS&#xff08;密钥管理服务&#xff09;协议…...

AI网关架构解析:统一管理多模型API,提升服务治理与性能

1. 项目概述&#xff1a;一个AI驱动的开源网关框架最近在开源社区里&#xff0c;我注意到一个名为hoazgazh/aigate的项目。这个名字乍一看有点神秘&#xff0c;但拆解一下&#xff0c;“aigate”直译就是“AI网关”。这立刻让我联想到当前技术领域的一个核心痛点&#xff1a;如…...

避开这些坑!用Verilog写2ASK/2FSK调制解调模块时的常见错误与调试技巧

避开这些坑&#xff01;用Verilog写2ASK/2FSK调制解调模块时的常见错误与调试技巧 在数字通信系统的FPGA实现中&#xff0c;2ASK和2FSK作为基础调制方式常被用于教学和原型验证。但看似简单的调制解调模块&#xff0c;实际开发中却暗藏诸多"陷阱"。本文将从工程实践角…...