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

算法通关村十四关:白银挑战-堆能高效解决的经典问题

白银挑战-堆能高效解决的经典问题

1.在数组中找第K大的元素

LeetCode215
https://leetcode.cn/problems/kth-largest-element-in-an-array/

思路分析

主要解决方法有3个,选择法,堆查找法和快速排序法

方法1:选择法
先遍历一遍找到最大的元素,再遍历一遍找第二大的,依次直到第K次就找到了目标值了

方法2:堆排序法
用大堆和小堆都可以,推荐"找最大用小堆,找最小用大堆,找中间用两个堆"

构造一个大小只有k的小根堆
堆满了之后,对于小根堆,并不一定所有新来的元素都可以入堆的,只有大于根元素的才可以插入到堆中,否则直接抛弃
完成之后此时根元素恰好时当前序列下第K大的元素

代码实现:
代码自己实现起来比较困难,可以使用jdk的优先队列来解决

  • 维护一个有k个元素的最小堆
  • 如果当前堆不满,直接添加
  • 堆满的时候,如果新读到的数小于堆顶,不操作;如果大于堆顶,将堆顶拿出,然后放入新读到的数,进而让堆自己调整内部结构

方法3:快速排序法
之前已经分析过了,见前面内容

代码实现

import java.util.PriorityQueue;class Solution {public int findKthLargest(int[] nums, int k) {if(k>nums.length){return -1;}int len = nums.length;// 使用一个含有k个元素的最小堆PriorityQueue<Integer> minHeap = new PriorityQueue<>(k, (a, b) -> a-b);for (int i = 0; i<k; i++){minHeap.add(nums[i]);}for(int i=k; i<len; i++){// 看一眼,不拿出,因为有可能没有必要替换Integer topEle = minHeap.peek();// 只要当前遍历的元素比堆顶元素大,堆顶弹出,遍历的元素进去if (nums[i] > topEle){minHeap.poll();minHeap.offer(nums[i]);}}return minHeap.peek();}
}

python中没有现成的二叉堆,要自己实现部分功能
参考:https://leetcode.cn/problems/kth-largest-element-in-an-array/solutions/1507044/by-flix-amc8/

2.堆排序原理

排序:升序用小,降序用大

大顶推:
根结点是整个结构最大的元素
将根结点拿走,剩下的重排,此时根结点就是第二大的元素
再拿走根结点,再排
以此类推,最后堆中只剩最后一个元素,此时拿走的数据也就排好序了

拿走重排的具体过程:移除堆顶元素,把下标为n的元素放到堆顶,再通过堆化的方法,将剩下的n-1个元素重新构建成堆

小顶堆与大顶堆类似

3.合并k个排序链表

LeetCode23. 合并 K 个升序链表
https://leetcode.cn/problems/merge-k-sorted-lists/

思路分析
问题有很多种方法,现在看使用堆排序如何解决

因为每个队列都是从小到大排序的,每次都要找最小的元素,所以用小根堆;
堆的大小定义,给了几个链表,堆就定义多大;
每次都将剩余节点的最小值加到输出链表尾部,然后进行堆调整;
最后堆空的时候,合并也就完成了。

代码实现

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode mergeKLists(ListNode[] lists) {if (lists == null || lists.length == 0){return null;}PriorityQueue<ListNode> q = new PriorityQueue<>(Comparator.comparing(node -> node.val));for (int i = 0; i<lists.length; i++){if(lists[i] != null){q.add(lists[i]);}}ListNode dummy = new ListNode(0);ListNode tail = dummy;while(!q.isEmpty()){tail.next = q.poll();tail = tail.next;if(tail.next != null){q.add(tail.next);}}return dummy.next;}
}

相关文章:

算法通关村十四关:白银挑战-堆能高效解决的经典问题

白银挑战-堆能高效解决的经典问题 1.在数组中找第K大的元素 LeetCode215 https://leetcode.cn/problems/kth-largest-element-in-an-array/ 思路分析 主要解决方法有3个&#xff0c;选择法&#xff0c;堆查找法和快速排序法 方法1&#xff1a;选择法 先遍历一遍找到最大的…...

跨站请求伪造(CSRF)攻击与防御原理

跨站请求伪造&#xff08;CSRF&#xff09; 1.1 CSRF原理 1.1.1 基本概念 跨站请求伪造&#xff08;Cross Site Request Forgery&#xff0c;CSRF&#xff09;是一种攻击&#xff0c;它强制浏览器客户端用户在当前对其进行身份验证后的Web 应用程序上执行非本意操作的攻击&a…...

从0到1实现播放控制器

这系列文章主要讲诉如何从0到1使用QT实现带时间显示、滚动字幕等的自定义配置视频播放控制器。平时我们乘坐地铁经常看到各条线的播放控制器都大同小异。其实都是通过QT等界面开发软件来实现的。 在具体开发之前&#xff0c;需要明确我们需要做什么&#xff1f; 1. 开发一个可…...

【Vue-Element-Admin】导出el-table全部数据

背景 因为el-table实现了分页查询&#xff0c;所以想要实现el-table需要重新编写一个查询全部数据的方法 查询全部数据 listQuery: export default{return{listQuery:{//page:1,//limit:20,//如果想兼容按条件导出&#xff0c;可以定义查询条件age:undefined,sex:undefined…...

MFC 更改控件的大小和位置

获取当前主窗体的位置rect CRect dlgNow;GetWindowRect(&dlgNow);获取某一个控件当前的位置 CRect rect;CButton* pBtn (CButton*)GetDlgItem(IDC_BUTTONXXX);//获取按钮控件pBtn->GetWindowRect(rect);CWnd* pWnd(CWnd*)GetDlgItem(IDC_EDITXXX);//其它控件&#xff0…...

【向量数据库】相似向量检索Faiss数据库的安装及余弦相似度计算(C++)

目录 简介安装方法安装OpenBLAS安装lapack编译Faiss 代码示例余弦相似度计算输出ID号而非索引的改进版 简介 Faiss 是一个强大的向量相似度搜索库&#xff0c;具有以下优点&#xff1a; 高效的搜索性能&#xff1a;Faiss 在处理大规模向量数据时表现出色。它利用了高度优化的索…...

教育培训小程序的设计与功能解析

随着互联网的发展&#xff0c;线上教育逐渐成为一种趋势&#xff0c;越来越多的人开始选择在线学习。而搭建一个适合自己的线上教育小程序&#xff0c;可以为教育机构或个人提供更好的教学和学习体验。在本文中&#xff0c;我们将介绍如何通过一个第三方制作平台来搭建在线教育…...

【ES】illegal_argument_exception“,“reason“:“Result window is too large

查询ES数据返回错误&#xff1a; {"root_cause":[{"type":"illegal_argument_exception","reason":"Result window is too large, from size must be less than or equal to: [10000] but was [999999]. See the scroll api for…...

SpringBoot实现登录拦截

如果我们不进行登录拦截的话&#xff0c;即使我们跳过登录页面直接去访问任意一个页面也能访问成功&#xff0c;那么登录功能就没有意义&#xff0c;同时也会存在安全问题&#xff0c;因为有些操作是要用户登录后才能执行的&#xff0c;如果用户没有登录&#xff0c;该接口就获…...

浅谈泛在电力物联网、能源互联网与虚拟电厂

导读&#xff1a;从能源互联网推进受阻&#xff0c;到泛在电力物联网名噪一时&#xff0c;到虚拟电厂再次走向火爆&#xff0c;能源领域亟需更进一步的数智化发展。如今&#xff0c;随着新型电力系统建设推进&#xff0c;虚拟电厂有望迎来快速发展。除了国网和南网公司下属的电…...

深度学习框架安装与配置指南:PyTorch和TensorFlow详细教程

如何安装和配置深度学习框架PyTorch和TensorFlow 为什么选择PyTorch和TensorFlow&#xff1f;PyTorchTensorFlow安装PyTorch 步骤1&#xff1a;安装Python步骤2&#xff1a;使用pip安装PyTorch 安装TensorFlow 步骤1&#xff1a;安装Python步骤2&#xff1a;使用pip安装TensorF…...

vue中属性执行顺序

vue中属性的执行顺序 在Vue 2中&#xff0c;组件的生命周期和数据绑定的执行顺序如下&#xff1a; data&#xff1a;首先&#xff0c;组件会调用 data 函数&#xff0c;该函数返回一个对象&#xff0c;该对象的属性和方法会被分配给组件的 $data。init&#xff1a;接下来&…...

【代码随想录】Day 50 动态规划11 (买卖股票Ⅲ、Ⅳ)

买卖股票Ⅲ https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-iii/ 无语了。。。 写的很好就是怎么都过不了。。。 还是就用代码随想录的写法吧。。。 class Solution { public:int maxProfit(vector<int>& prices) {int n prices.size();vector&…...

PHP反序列化漏洞

一、序列化&#xff0c;反序列化 序列化&#xff1a;将php对象压缩并按照一定格式转换成字符串过程反序列化&#xff1a;从字符串转换回php对象的过程目的&#xff1a;为了方便php对象的传输和存储 seriallize() 传入参数为php对象&#xff0c;序列化成字符串 unseriali…...

容器编排学习(一)k8s集群管理

一 Kubernetes 1 概述 就在Docker容器技术被炒得热火朝天之时&#xff0c;大家发现&#xff0c;如果想要将Docker应用于具体的业务实现&#xff0c;是存在困难的一一编排、管理和调度等各个方面&#xff0c;都不容易。于是&#xff0c;人们迫切需要一套管理系统&#xff0…...

js去除字符串空格的几种方式

方法1&#xff1a;(最常用)全部去除掉空格 var str abc d e f g ; function trim(str) { var reg /[\t\r\f\n\s]*/g; if (typeof str string) { var trimStr str.replace(reg,); } console.lo…...

Spring 自带工具——URI 工具UriComponentsBuilder

UriComponentsBuilder 是 Spring Framework 提供的一个实用工具类&#xff0c;用于构建 URI&#xff08;Uniform Resource Identifier&#xff09;。URI 是用于标识和定位资源的字符串&#xff0c;例如 URL&#xff08;Uniform Resource Locator&#xff09;就是一种特殊的 URI…...

优化案例5:视图目标列改写优化

优化案例5&#xff1a;视图目标列改写优化 1. 问题描述2. 分析过程2.1 目标SQL2.2 解决思路1&#xff09;效率低的执行计划2&#xff09;视图过滤性3&#xff09;查看已有索引定义 2.3 视图改写2.4 增添复合索引 3. 优化总结 DM技术交流QQ群&#xff1a;940124259 1. 问题描述…...

Origin绘制彩色光谱图

成果图 1、双击线条打开如下窗口 2、选择“图案”-》颜色-》按点-》映射-》Wavelength 3、选择颜色映射 4、单击填充-》选择加载调色板-》Rainbow-》确定 5、单击级别&#xff0c;设置成从370到780&#xff0c;右侧增量选择2&#xff08;越小&#xff0c;颜色渐变越细腻&am…...

项目复盘:从实践中学习

引言 在我们的工作生涯中&#xff0c;每一个项目都是一次学习的机会。项目复盘是对已完成项目的全面评估&#xff0c;旨在理解我们做得好的地方&#xff0c;以及需要改进的地方。这篇文章将分享我们如何进行项目复盘&#xff0c;以及我们从中学到了什么。 项目背景 在我们开…...

机器学习和数据挖掘02-Gaussian Naive Bayes

概念 贝叶斯定理&#xff1a; 贝叶斯定理是概率中的基本定理&#xff0c;描述了如何根据更多证据或信息更新假设的概率。在分类的上下文中&#xff0c;它用于计算给定特征集的类别的后验概率。 特征独立性假设&#xff1a; 高斯朴素贝叶斯中的“朴素”假设是&#xff0c;给定…...

【面试题精讲】Java Stream排序的实现方式

首发博客地址 系列文章地址 如何使用Java Stream进行排序 在Java中&#xff0c;使用Stream进行排序可以通过sorted()方法来实现。sorted()方法用于对Stream中的元素进行排序操作。具体实现如下&#xff1a; 对基本类型元素的排序&#xff1a; 使用sorted()方法对Stream进行排序…...

浅谈Spring

Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器&#xff08;框架&#xff09;。 一、什么是IOC&#xff1f; IoC Inversion of Control 翻译成中⽂是“控制反转”的意思&#xff0c;也就是说 Spring 是⼀个“控制反转”的容器。 1.1控制反转推导 这个控制反转怎…...

Java 复习笔记 - 面向对象进阶篇

文章目录 一&#xff0c;Static&#xff08;一&#xff09;Static的概述&#xff08;二&#xff09;静态变量&#xff08;三&#xff09;静态方法&#xff08;四&#xff09;工具类&#xff08;五&#xff09;static的注意事项 二&#xff0c;继承&#xff08;一&#xff09;继…...

微信小程序中识别html标签的方法

rich-text组件 在微信小程序中有一个组件rich-text可以识别文本节点或是元素节点 具体入下: //需要识别的数据放在data中,然后放在nodes属性中即可 <rich-text nodes"{{data}}"></rich-text>详情可以参考官方文档:https://developers.weixin.qq.com/mi…...

02_常见网络层协议的头结构

1.ARP报文的报文结构 ARP首部的5个字段的含义&#xff1a; 硬件类型&#xff1a;值为1表示以太网MAC地址。 协议类型&#xff1a;表示要映射的协议地址类型&#xff0c;0x0800 表示映射为IP地址。 硬件地址长度&#xff1a;在以太网ARP的请求和应答中都是6&#xff0c;表示M…...

ChatGLM学习

GLM paper&#xff1a;https://arxiv.org/pdf/2103.10360.pdfchatglm 130B&#xff1a;https://arxiv.org/pdf/2210.02414.pdf 前置知识补充 双流自注意力 Two-stream self-attention mechanism&#xff08;双流自注意机制&#xff09;是一种用于自然语言处理任务的注意力机制…...

Flink之Watermark

1.乱序问题 流处理从事件产生&#xff0c;到流经source&#xff0c;再到operator&#xff0c;中间是有一个过程和时间的&#xff0c;虽然大部分情况下&#xff0c;流到operator的数据都是按照事件产生的时间顺序来的&#xff0c;但是也不排除由于网络、分布式等原因&#xff0…...

二轮平衡小车3:PID速度环

使用芯片&#xff1a;STM32 F103 C8T6 今日继续我的二路平衡小车开发之路&#xff0c;今日编写的是二轮平衡小车的PID速度环&#xff0c;我准备了纸飞机串口助手软件来辅助测试调节PID。 本文主要贴代码&#xff0c;之前的文章都有原理&#xff0c;代码中相应初始化驱动部分也…...

C语言之练习题

欢迎来到我的世界 希望这篇文章对你有所帮助&#xff0c;有不足的地方还请指正&#xff0c;大家一起学习交流 ! 目录 前言编程题第一题&#xff1a;珠玑妙算第二题&#xff1a;寻找奇数第三题&#xff1a;寻找峰值第四题&#xff1a;数对 总结 前言 这是暑假题目的收尾文章&am…...

做网站的dreamweaver/广州外贸推广

本文经过作者亲自测试&#xff0c;如有问题或者更好的解决方案&#xff0c;还望各位指出纠正。 原因&#xff1a; 因为word有自动检查错误的功能&#xff0c;就算关闭了自动检查的功能&#xff0c;只要稍微改动就有报上边的错误。 最佳解决方案&#xff1a; 在记事本上写好对应…...

帮别人做时时彩网站/免费建自己的网址

华为防火墙USG5500重点&#xff1a;什么是防火墙&#xff1b;防火墙基础&#xff1b;防火墙功能配置一.什么是防火墙&#xff1a;1.什么是防火墙&#xff1a;防火墙主要用于保护一个网络免受来自另一个网络的***和***行为&#xff0c;因其隔离、防守属性&#xff0c;防火墙灵活…...

网站建设图片教程/怎么制作网页教程

打开程序集的属性窗口&#xff0c;找到“安全性”设置&#xff0c;其中有一个“启用 ClickOnce 安全性设置”&#xff0c;勾选后再反勾选该复选框。 此时在解决方案资源管理器中&#xff0c;就可以找到 app.manifest 文件&#xff0c;勾选“启用 ClickOnce 安全性设置”是为了让…...

广州建网站的公司有哪些/做百度推广的业务员电话

问题&#xff1a; 仅用慢日志文件&#xff0c;如何快速获取分时报告&#xff1f; 如果有监控系统&#xff0c;获取分时报告&#xff08;每小时慢查询的条数报告&#xff09;不难&#xff0c;如果只有慢日志文件&#xff0c;就会有点费劲。 实验&#xff1a; 通过 pt-query-…...

龙岗住房建设局网站/无锡百度竞价推广

JSON&XML&#xff1a; JSON&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d; //英译 Serialization:序列化 perform:执行 segue&#xff1a;继续 IOS5后 NSJSONSerialization解析 解析JSON SBJSON JSONKit touchJson的第三方库 性能&#xff1a;NSJSONSerial…...

为什么要用php做网站/百度最贵关键词排名

局域网客户端的管理 随着网络用户数量的不断增加&#xff0c;由此而引发的网络通信和安全故障越来越多。尤其是对网络滥用导致的网络拥塞&#xff0c;以及蠕虫病毒泛滥导致的性能下降&#xff0c;以及系统漏洞导致的恶意攻击&#xff0c;如果不采取相应的、有力的应对措施&…...