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

【Hot100】LeetCode—215. 数组中的第K个最大元素

目录

  • 1- 思路
    • 快速选择
  • 2- 实现
    • 215. 数组中的第K个最大元素——题解思路
  • 3- ACM实现


  • 原题连接:215. 数组中的第K个最大元素

1- 思路

快速选择

  • 第 k 大的元素的数组下标: int target = nums.length - k

1- 根据 partition 分割的区间来判断当前处理方式

  • 如果返回的 int 等于 target 说明找到了,直接返回
  • 如果返回的 int 小于 target 说明要在当前区间的右侧寻找,也就是 [pivotIndex+1,right]
  • 如果返回的 int 大于 target 说明要在当前区间的左侧寻找,也就是 [left,pivotIndex-1]

2- 实现 partition 随机选取一个 pivotIndex 分割区间

  • 2-1 随机选择一个下标
  • 2-2 交换 left 和 随机下标
  • 2-3 将随机下标的元素值设置为 pivot
  • 2-4 定义 lege 下标 使用 while(true)
    • 使得 le 指向的元素始终小于 pivot
    • 使得 ge 指向的元素始终大于 pivot

2- 实现

215. 数组中的第K个最大元素——题解思路

在这里插入图片描述

import java.util.Random;
class Solution {static Random random = new Random(System.currentTimeMillis());public int findKthLargest(int[] nums,int k){return quickSelect(nums,0,nums.length-1,nums.length-k);}public int quickSelect(int[] nums,int left,int right,int kIndex){if(right==left){return nums[left];}//int pivotIndex = partition(nums,left,right);if(pivotIndex == kIndex){return nums[kIndex];}else if( pivotIndex>kIndex){return quickSelect(nums,left,pivotIndex-1,kIndex);}else{return quickSelect(nums,pivotIndex+1,right,kIndex);}}public int partition(int[] nums,int left,int right){int randomIndex = left + random.nextInt(right-left+1);swap(nums,left,randomIndex);int mid = nums[left];int le = left+1;int ge = right;while(true){while(le<=ge && nums[le] < mid){le++;}while(le<=ge && nums[ge] > mid){ge--;}if(le>=ge){break;}swap(nums,le,ge);le++;ge--;}swap(nums,left,ge);return ge;}public void swap(int[] nums,int left,int right){int tmp = nums[left];nums[left] = nums[right];nums[right] = tmp;}}

3- ACM实现

public class kthNums {static Random random = new Random(System.currentTimeMillis());public static int findK(int[] nums,int k){// 快速选择 ,传四个参数return quickSelect(nums,0,nums.length-1,nums.length-k);}public static int quickSelect(int[] nums,int left,int right,int kIndex){if(right==left){return nums[left];}//int pivotIndex = partition(nums,left,right);if(pivotIndex == kIndex){return nums[kIndex];}else if( pivotIndex>kIndex){return quickSelect(nums,left,pivotIndex-1,kIndex);}else{return quickSelect(nums,pivotIndex+1,right,kIndex);}}public static int partition(int[] nums,int left,int right){int randomIndex = left + random.nextInt(right-left+1);swap(nums,left,randomIndex);int mid = nums[left];int le = left+1;int ge = right;while(true){while(le<=ge && nums[le] < mid){le++;}while(le<=ge && nums[ge] > mid){ge--;}if(le>=ge){break;}swap(nums,le,ge);le++;ge--;}swap(nums,left,ge);return ge;}public static void swap(int[] nums,int left,int right){int tmp = nums[left];nums[left] = nums[right];nums[right] = tmp;}public static void main(String[] args) {Scanner sc = new Scanner(System.in);String input = sc.nextLine();String[] parts = input.split(" ");int[] nums = new int[parts.length];for(int i = 0 ; i < nums.length ; i++){nums[i] = Integer.parseInt(parts[i]);}System.out.println("输入K");int k = sc.nextInt();System.out.println("结果是"+findK(nums,k));}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Qt常用控件——QLineEdit
  • uts+uniapp踩坑记录(vue3项目
  • 美团面试题:生成字符串的不同方式
  • 期权有哪些开户免50万元验资的方法?怎么操作?
  • 《C++位域:在复杂数据结构中的精准驾驭与风险规避》
  • uniapp微信小程序开发踩坑日记:Pinia持久化报错Cannot read property ‘localStorage‘ of undefined
  • map与set
  • 基于SpringBoot的医院挂号预约管理系统
  • vulnhub靶机:Holynix: v1
  • Capital许可管理最佳实践
  • PCI Express 体系结构导读摘录(六)
  • C语言:结构体
  • 今天一定要彻底卸载Windows Denfender!攻略给你了
  • 为什么kubectl top命令查看节点内存使用超过100%?
  • Wophp靶场寻找漏洞练习
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • Angular2开发踩坑系列-生产环境编译
  • axios 和 cookie 的那些事
  • ES6简单总结(搭配简单的讲解和小案例)
  • IndexedDB
  • interface和setter,getter
  • Invalidate和postInvalidate的区别
  • js如何打印object对象
  • nginx 配置多 域名 + 多 https
  • Swift 中的尾递归和蹦床
  • ucore操作系统实验笔记 - 重新理解中断
  • 关于Java中分层中遇到的一些问题
  • 解决iview多表头动态更改列元素发生的错误
  • 利用DataURL技术在网页上显示图片
  • 前端自动化解决方案
  • 算法---两个栈实现一个队列
  • 我看到的前端
  • 物联网链路协议
  • FaaS 的简单实践
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • MyCAT水平分库
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • PostgreSQL之连接数修改
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • #git 撤消对文件的更改
  • #pragma once
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • (C语言)字符分类函数
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (九)信息融合方式简介
  • (十一)图像的罗伯特梯度锐化
  • (一)SvelteKit教程:hello world
  • (转)拼包函数及网络封包的异常处理(含代码)
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • (自用)仿写程序
  • ******之网络***——物理***
  • .NET COER+CONSUL微服务项目在CENTOS环境下的部署实践