排序算法、堆排序、大顶堆、小顶堆、手写快排-215. 数组中的第K个最大元素、2336. 无限集中的最小数字

目录

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

题目链接及描述

题目分析

堆排序分析

堆排序代码编写

快排分析

快排代码编写

2336、无限集中的最小数字

题目链接及描述

题目分析

代码编写


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

题目链接及描述

215. 数组中的第K个最大元素 - 力扣(LeetCode)

题目分析

堆排序分析

        题目所述为找到第K个最大元素,首先想到使用Arrays.sort(nums); return nums[nums.length - k]即可解决,此时很好,可以回家等通知了。

        第K个最大元素,如果创建一个小顶堆,堆顶元素为最小,并维护堆中元素个数为K,当nums数组遍历结束后,堆顶元素即为返回的元素。

        在Java中创建小顶堆以及大顶堆可以使用线程的PrioriityQueue来实现:

        Java中的单列集合Collection及其实现类如上,通过上面图示,可以看到PriorityQueue就是Collection的一个实现类,创建代码参考如下:

        PriorityQueue<Integer> pq = new PriorityQueue<>((a,b)->a - b);    //小顶堆PriorityQueue<Integer> pq = new PriorityQueue<>((a,b)->b - a);    //大顶堆

堆排序代码编写

    public int findKthLargest(int[] nums, int k) {PriorityQueue<Integer> pq = new PriorityQueue<>((a,b)->a - b);for(int num : nums){if(pq.size() < k){pq.add(num);}else if(num > pq.peek()){pq.poll();pq.add(num);}}return pq.peek();}

        这道题目如果在面试中出现的话,可能还是需要手写堆排序的,自己抽时间学习学习手写堆排序随后补充上。 

快排分析

        快排本质上就是对Arrays.sort(nums)的一种优化手段,具体可以网上查找资源,贴出自己编写的快排代码实现。

快排代码编写

class Solution {public int findKthLargest(int[] nums, int k) {int len = nums.length;// 第1大的元素:len - 1;// 第2大的元素:len - 2;// 第k大的元素:len - k;mySort(nums, 0, len - 1);return nums[len - k];}public void mySort(int[] nums, int L, int R){if(L >= R)  return;int pivot = nums[L];int le = L + 1, ge = R;while(true){while(le <= ge && nums[le] < pivot) ++le;while(le <= ge && nums[ge] > pivot) --ge;if(le >= ge)    break;mySwap(nums, le, ge);++le;--ge; }mySwap(nums, L, ge);mySort(nums, L, ge - 1);mySort(nums, ge + 1, R);}public void mySwap(int[] nums, int idx1, int idx2){int temp = nums[idx1];nums[idx1] = nums[idx2];nums[idx2] = temp;}
}

2336、无限集中的最小数字

题目链接及描述

2336. 无限集中的最小数字 - 力扣(LeetCode)

题目分析

         初次看到这个题目并没有将其和优先级队列联系起来,题目所述首先存储了所有正整数,随后popSmallest()和addBack()两个方法,对初始化的正整数数组进行操作。

  • int popSmallest() 移除 并返回该无限集中的最小整数。
  • void addBack(int num) 如果正整数 num  存在于无限集中,则将一个 num 添加 到该无限集最后。

        首先不可能创建一个数组或者List集合将所有正整数存储起来,想到的是设置一个标志位:如threshold,此值代表的含义为【threshold, +oo)这部分正整数尚未操作过,仍然存在于初始化数组中。【1,threshold)这部分数据已经从初始化数组中弹出。

         此时对于addBack(int num)方法调用而言,只需要判断,num 和 threshold的关系,

  • 如果num >  threshold,说明原集合中已经存在num,无法继续添加。
  • 如果num <  threshold,说明除初始集合中已经不存在num,需要将其添加至集合中,由于初始使用一个值threshold代表集合,此时可以创建一个小顶堆和哈希表set用于存储num,只有set中不存在num时将num对应的数据分别添加到set和小顶堆中。【哈希表set只是判断元素num知否已经出现过,如果出现过,则不添加,否则添加】

      int popSmallest() 移除元素的方法调用此时也分为两种情况即可。

  • 如果小顶堆队列不为空,则获取小顶堆堆顶对应的元素,并将其弹出。将set中对应的元素remove()掉,返回堆顶元素即可。
  • 如果小顶堆此时为空,直接返回threshold++。即返回了当前对应的元素,同时又将当前对应元素从"集合"中删除。

代码编写

class SmallestInfiniteSet {public int threshold;public PriorityQueue<Integer> pq;public Set<Integer> set;public SmallestInfiniteSet() {this.threshold = 1;this.pq = new PriorityQueue<>((a, b)->a - b);this.set = new HashSet<>();}public int popSmallest() {if(pq.size() > 0){set.remove(pq.peek());return pq.poll();}return threshold++;}public void addBack(int num) {if(num >= threshold){return;}if(!set.contains(num)){set.add(num);pq.add(num);}}
}
/*** Your SmallestInfiniteSet object will be instantiated and called as such:* SmallestInfiniteSet obj = new SmallestInfiniteSet();* int param_1 = obj.popSmallest();* obj.addBack(num);*/

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python函数——基础

一、函数基础 函数体&#xff08;功能代码块&#xff09; 函数是执行特定任务的代码块&#xff0c;通过调用函数名并传递参数&#xff08;如果有的话&#xff09;来执行这些任务。 函数的参数 参数列表由一系列参数组成&#xff0c;使用逗号分隔。实参&#xff1a;调用函数时…

C#.net6.0语言+B/S架构+前后端分离 手术麻醉信息管理系统源码

C#.net6.0语言&#xff0b;B/S架构前后端分离 手术麻醉信息管理系统源码 什么是手术麻醉信息管理系统 满足医院等级评级需求 满足电子病历评级需求 满足科室需求 术前 1、患者术前评估/诊断 2、术前讨论制定手术方案 3、手术准备 4、术前准备 术中 1、送手术室 2、麻…

数据库浅识及MySQL的二进制安装

数据库基础概念与MySQL二进制安装与初始化 使用数据库的必要性 数据库可以结构化储存大量数据信息&#xff0c;方便用户进行有效的检索访问 有效的保持数据信息的一致性&#xff0c;完整性&#xff0c;降低数据冗余 可以满足应用的共享和安全方面的要求 数据库基本概念 数据…

C语言经典算法题第一题

题目&#xff1a;古典问题&#xff1a;有一对兔子&#xff0c;从出生后第3个月起每个月都生一对兔子&#xff0c;小兔 子长到第三个月后每个月又生一对兔子&#xff0c;假如兔子都不死&#xff0c;问每个月的兔子总数 为多少&#xff1f; #include <stdio.h>int main() …

Swagger文档渲染,将Filter过滤器中抛出的异常错误消息返回前端显示

一、应用场景 在swagger通过/v2/api-docs获取到后端接口数据后&#xff0c;使用过滤器对/v2/api-docs请求进行拦截&#xff0c;然后对获取到的数据进行处理&#xff0c;当在处理过程中对Filter过滤器中抛出的异常错误消息进行捕获&#xff0c;并将捕获到的异常错误消息返回到前…

【SpringBoot3.x】自定义开发通用SDK

1. 前言 相信大家学习SpringBoot到现在&#xff0c;使用Maven构建项目时&#xff0c;会在pom.xml文件中引入各种各样的依赖&#xff0c;那么我们如何将自己常用的一些工具类库进行封装成starter或者SDK供其他项目使用呢&#xff0c;本博客就会带着大家一步一步创建自定义的SDK…

开源TinyFSM状态机适用于嵌入式工业平台吗?

文章目录 引言基于传统 C 实现的状态机TinyFSM 实现的对比现代 C 实现的状态机性能对比TinyFSM 性能测试传统 C 性能测试现代 C 性能测试 工业Misra C编程标准TinyFSM 的优缺点分析结论 引言 TinyFSM是一个为C设计的轻量级有限状态机开源库库。 在嵌入式系统开发中&#xff0c…

倍思突破氮化镓快充技术,为用户带来安全舒适体验

氮化镓,这个化学式为GaN的化合物,其高热稳定性和化学稳定性使其在多种极端环境中都能保持优良的性能,从而为其在电子器件领域的应用奠定了坚实的基础。 2018年前后开始,氮化镓快充充电器进入国内市场。作为第三代半导体材料的代表,氮化镓具有宽禁带的特性,其禁带宽度远大于传统…

Python连接Redis(简单连接、连接池连接、存取数据示例)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

数据中心:AI范式下的内存挑战与机遇

在过去的十年里&#xff0c;数据中心和服务器行业经历了前所未有的扩张&#xff0c;这一进程伴随着CPU核心数量、内存带宽(BW)&#xff0c;以及存储容量的显著增长。这种超大规模数据中心的扩张不仅带来了对计算能力的急剧需求&#xff0c;也带来了前所未有的内存功率密度挑战&…

Docker 从安装到使用的完整指南

目录 什么是 DockerDocker 的核心概念 镜像容器DockerfileDocker Compose Docker 的安装 在 Windows 上安装 Docker在 macOS 上安装 Docker在 Linux 上安装 Docker Docker 的基本使用 启动第一个容器管理容器构建自定义镜像使用 Docker Compose 高级主题 Docker 网络Docker 数…

适合孩子学习用什么的落地灯?五款精品护眼大路灯分享

适合孩子学习用什么的落地灯&#xff1f;说到护眼落地灯&#xff0c;都会出现两种呼声&#xff1a;一种是认为是“智商税”&#xff0c;而另外一种则是妥妥的照明神器&#xff01;护眼大路灯到底是哪种定义呢&#xff1f;贵的护眼灯一定好吗&#xff1f; 这么年&#xff0c;护…

区块链技术:重塑金融市场监管的新引擎

一、引言 随着金融市场的不断发展和创新&#xff0c;监管面临的挑战也日益严峻。传统的监管模式已难以满足现代金融市场的需要&#xff0c;而区块链技术的出现为金融市场监管带来了新的机遇。本文将探讨区块链技术在金融市场监管中的作用&#xff0c;以及它如何重塑监管模式&a…

深入研究websocket直播中signature这个参数怎么来的,模拟自己生成一个

上一节课我们已经找到了生成signature这个字段的代码位置&#xff0c;就是这个B函数&#xff0c;嗯......听起来好像有点奇怪&#xff0c;但是它确实叫B啊&#xff0c;笑死。不管了&#xff0c;看一下里面的逻辑是啥。 注意e参数的内容是&#xff1a; {"app_name":…

【Academy】API测试API testing

API测试API testing 概述API侦察API文档发现API文档使用机器可读的API文档 标识API端点与API端点交互确定支持的HTTP方法确定支持的内容类型使用Intruder查找隐藏端点 查找隐藏参数大量分配漏洞识别隐藏参数测试大规模分配漏洞 防止API中的漏洞服务端参数污染测试查询字符串中的…

作业管理系统

摘 要 随着网络的发展&#xff0c;信息化时代的到来&#xff0c;在教学工作的过程中作用越来越明显&#xff0c;作业的及时发布&#xff0c;学生的及时提交&#xff0c;以及通过网上的批改和评分&#xff0c;都大大促进教学质量的发展&#xff0c;充分的利用网络来加强管理&am…

用类来实现输入和输出时间(时:分:秒)

编写程序&#xff1a; 运行结果&#xff1a; 程序分析&#xff1a; 这是一个很简单的例子。类Time中只有数据成员&#xff0c;而且它们被定义为公用的&#xff0c;因此可以在类的外面对这些成员进行操作。t1被定义为Time类的对象。在主函数中向t1对象的数据成员输入用户…

MongoDB基础知识

​ 文档是mongodb中的最初单元&#xff0c;类似于mysql中的行&#xff0c;集合可以看做一个具有动态模式的表&#xff0c;mongodb可以拥有多个互相独立的数据库&#xff0c;每个数据库&#xff0c;都拥有自己的集合&#xff1b;每一个文档都有一个特殊的健&#xff1a;“_id”&…

“一站式企业服务平台”的功能架构

为提升区域营商环境&#xff0c;为促进区域经济发展&#xff0c;实现资源高效配置&#xff0c;全国各区域政府及产业园区都越来越重视如何创新企业服务机制、提升企业服务水平&#xff0c;来保障区域内的企业稳定及帮扶企业高质量的发展。随着近年来大数据、人工智能等新一代信…

前端记录日志生成文件保存到本地

一、前言 项目上线后业务人员反馈说是打印数据不准确&#xff0c;通过websocket连接打印机服务去进行打印&#xff0c;会出现条码漏打的情况&#xff1b;通过后端日志和打印机日志均没有找到问题原因&#xff0c;猜测是websocket连接断开导致的问题。 也想通过前端日志去排查…