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

[Go版]算法通关村第十四关白银——堆高效解决的经典问题(在数组找第K大的元素、堆排序、合并K个排序链表)

目录

题目:在数组中找第K大的元素

题目链接:LeetCode-215. 数组中的第K个最大元素
在这里插入图片描述

解法1:维护长度为k的最小堆,遍历n-k个元素,逐一和堆顶值对比后,和堆顶交换,最后返回堆顶

复杂度:时间复杂度 O ( k + ( n − k ) l o g k ) O(k+(n-k)logk) O(k+(nk)logk)、空间复杂度 O ( 1 ) O(1) O(1)

Go代码

func findKthLargest(nums []int, k int) int {length := len(nums)if k > length {return -1}makeMinHeap(nums, k)for i:=k;i<length;i++ {if nums[i] > nums[0] {nums[0], nums[i] = nums[i], nums[0]minHeap(nums, 0, k)}}return nums[0]
}func makeMinHeap(arr []int, length int) {// 从最后一个非叶子节点开始for i:=(length/2-1); i>=0; i-- {minHeap(arr, i, length)}
}// 最小堆化
func minHeap(arr []int, i int, length int) {left, right := 2*i+1, 2*i+2min := iif left < length && arr[left] < arr[min] {min = left}if right < length && arr[right] < arr[min] {min = right}if min != i {arr[i], arr[min] = arr[min], arr[i]minHeap(arr, min, length)}
}

解法2:构建长度为n的最大堆,遍历k次,每次删除堆顶,且堆长度-1,最后返回堆顶(k较小时此法更优)

复杂度:时间复杂度 O ( n + k l o g n ) O(n+klogn) O(n+klogn)、空间复杂度 O ( 1 ) O(1) O(1)

Go代码

func findKthLargest(nums []int, k int) int {length := len(nums)if k > length {return -1}// 将nums构建为一个最大堆makeMaxHeap(nums, length)for i:=1; i<k; i++ {nums[0], nums[length-i] = nums[length-i], nums[0]maxHeap(nums, 0, length-i)}return nums[0]
}// 最大堆
func makeMaxHeap(arr []int, length int) {// 第一个非叶子节点for i:=(length/2-1); i>=0; i-- {maxHeap(arr, i, length)}
}
// 最大堆化
func maxHeap(arr []int, i int, length int) {l, r, max := 2*i+1, 2*i+2, iif l<length && arr[l] > arr[max] {max = l}if r<length && arr[r] > arr[max] {max = r}if max != i {arr[max], arr[i] = arr[i], arr[max]maxHeap(arr, max, length)}
}

题目:堆排序

题目链接:LeetCode-912. 排序数组
在这里插入图片描述

思路分析:构建长度为n的最大堆,依次删除堆顶并逆序放到数组尾部,且堆长度-1,n-1次后数组则为升序

复杂度:时间复杂度 O ( n l o g ( n ) ) O(nlog(n)) O(nlog(n))、空间复杂度 O ( 1 ) O(1) O(1)

Go代码

func sortArray(nums []int) []int {length := len(nums)if length == 1 {return nums}makeMaxHeap(nums, length)for i:=length-1; i>0; i-- {nums[0], nums[i] = nums[i], nums[0]maxHeap(nums, 0, i)}return nums
}
// 构建最大堆
func makeMaxHeap(nums []int, length int) {// 第一个非叶子结点for i:=length/2-1; i>=0; i-- {maxHeap(nums, i, length)}
}
// 最大堆化
func maxHeap(nums []int, i int, length int) {l, r, max := 2*i+1, 2*i+2, iif l<length && nums[l] > nums[max] {max = l}if r<length && nums[r] > nums[max] {max = r}if max != i {nums[max], nums[i] = nums[i], nums[max]maxHeap(nums, max, length)}
}

题目:合并K个排序链表

题目链接:LeetCode-23. 合并 K 个升序链表
在这里插入图片描述

思路分析:维护长度为k的最小堆,依次删除堆顶接到返回链表上(纵向拼接),注意取值时判断空链表

复杂度:时间复杂度 O ( k + n l o g k ) O(k+nlogk) O(k+nlogk)、空间复杂度 O ( 1 ) O(1) O(1)

Go代码

/*** Definition for singly-linked list.* type ListNode struct {*     Val int*     Next *ListNode* }*/
func mergeKLists(lists []*ListNode) *ListNode {length := len(lists)if length == 1 {return lists[0]}// 去除空数组for i:=0; i<length; i++ {if lists[i] == nil {lists[i], lists[length-1] = lists[length-1], lists[i]length--i--}}newList := &ListNode{}tmp := newList// 最小化makeMinHeap(lists, length)for length > 0 && lists[0] != nil {// 取出当前最小tmp.Next = &ListNode{Val:lists[0].Val}tmp = tmp.Nextlists[0] = lists[0].Nextif lists[0] == nil {lists[0], lists[length-1] = lists[length-1], lists[0]length--}if length > 0 && lists[0] != nil {minHeap(lists, 0, length)}}return newList.Next
}func makeMinHeap(arr []*ListNode, length int) {for i:=length/2-1; i>=0; i-- {minHeap(arr, i, length)}
}func minHeap(arr []*ListNode, i, length int) {left, right, min := 2*i+1, 2*i+2, iif left<length && arr[left].Val < arr[min].Val {min = left}if right<length && arr[right].Val < arr[min].Val {min = right}if min != i {arr[min], arr[i] = arr[i], arr[min]minHeap(arr, min, length)}
}

相关文章:

[Go版]算法通关村第十四关白银——堆高效解决的经典问题(在数组找第K大的元素、堆排序、合并K个排序链表)

目录 题目&#xff1a;在数组中找第K大的元素解法1&#xff1a;维护长度为k的最小堆&#xff0c;遍历n-k个元素&#xff0c;逐一和堆顶值对比后&#xff0c;和堆顶交换&#xff0c;最后返回堆顶复杂度&#xff1a;时间复杂度 O ( k ( n − k ) l o g k ) O(k(n-k)logk) O(k(n−…...

『FastGithub』一款.Net开源的稳定可靠Github加速神器,轻松解决GitHub访问难题

&#x1f4e3;读完这篇文章里你能收获到 如何使用FastGithub解决Github无法访问问题了解FastGithub的工作原理 文章目录 一、前言二、项目介绍三、访问加速原理四、FastGithub安装1. 项目下载2. 解压双击运行3. 运行效果4. GitHub访问效果 一、前言 作为开发者&#xff0c;会…...

软件开发的201个原则 阅读笔记 第172-201个原则

目录 原则172 做项目总结 第8章 产品保证原则 原则173 产品保证并不是奢侈品 原则 174 尽早建立软件配置管理过程 原则175 使软件配置管理适应软件过程 原则176 组织SCM 独立于项目管理 原则 177 轮换人员到产品保证组织 给所有中间产品一个名称和版本 原则179 控制基准 原则…...

vue 后台管理系统登录 记住密码 功能(Cookies实现)

安装插件 import Cookies from js-cookie 组件引入 import Cookies from js-cookie; 存值&#xff1a; Cookies.set(username, state.account, { expires: 30 }); // username 存的值的名字&#xff0c;state.account 存的值 expires 存储的时间&#xff0c;30天Cookies…...

elementUI moment 年月日转时间戳 时间限制

changeStartTime(val){debuggerthis.startT val// this.startTime parseInt(val.split(-).join())this.startTime moment(val).unix() * 1000 //开始时间毫秒if(this.endTime){this.endTime moment(this.endT).unix() * 1000 //结束时间毫秒if(this.startTime - this.endTi…...

用AI + Milvus Cloud搭建着装搭配推荐系统教程

以下函数定义了如何将图像转换为向量并插入到 Milvus Cloud 向量数据库中。代码会循环遍历所有图像。(注意:如果需要开启 Milvus Cloud 全新特性动态 Schema,需要修改代码。) 查询向量数据库 以下代码演示了如何使用输入图像查询 Milvus Cloud 向量数据库,以检索和上传…...

大数据领域都有什么发展方向

近年来越来越多的人选择大数据行业&#xff0c;大数据行业前景不错薪资待遇好&#xff0c;各大名企对于大数据人才需求不断上涨。 大数据从业领域很宽广&#xff0c;不管是科技领域还是食品产业&#xff0c;零售业等都是需要大数据人才进行大数据的处理&#xff0c;以提供更好…...

NSSCTF——Web题目1

目录 一、[LitCTF 2023]PHP是世界上最好的语言&#xff01;&#xff01; 二、[LitCTF 2023]Ping 三、[SWPUCTF 2021 新生赛]easyupload1.0 四、[SWPUCTF 2021 新生赛]easyupload2.0 五、[SWPUCTF 2021 新生赛]caidao 一、[LitCTF 2023]PHP是世界上最好的语言&#xff01;&a…...

VScode中写Verilog时,iverilog语法自动纠错功能不起作用

VScode中编写Verilog时&#xff0c;iverilog语法自动纠错功能不起作用 问题&#xff1a;按照教程搭建vscode下Verilog编译环境&#xff0c;发现语法纠错功能一直无效&#xff0c;检查了扩展Verilog-HDL/SystemVerilog/Bluespec SystemVerilog的配置也没有任何问题。 错误原因&a…...

thinkphp6.0 配合shell 脚本 定时任务

1. 执行命令&#xff0c;生成自定义命令 php think make:command Custom<?php declare (strict_types 1);namespace app\command;use app\facade\AdmUser; use think\console\Command; use think\console\Input; use think\console\input\Argument; use think\console\i…...

18-使用钩子函数判断用户登录权限-登录前缀

钩子函数的两种应用: (1). 应用在app上 before_first_request before_request after_request teardown_request (2). 应用在蓝图上 before_app_first_request #只会在第一次请求执行,往后就不执行, (待定,此属性没调试通过) before_app_request # 每次请求都会执行一次(重点…...

关闭win11启动界面搜索推荐

环境&#xff1a;win11 最近win11更新了某些功能&#xff0c;附带加上了搜索推荐的功能。对于启动菜单的搜索功能&#xff0c;我只想搜索我自己的安装的程序&#xff0c;快速打开&#xff0c;不希望看到搜索推荐&#xff0c;更不希望多点击一下&#xff0c;偶尔还会打开浏览器看…...

中文乱码处理

&#x1f600;前言 中文乱码处理 &#x1f3e0;个人主页&#xff1a;尘觉主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是尘觉&#xff0c;希望我的文章可以帮助到大家&#xff0c;您的满意是我的动力&#x1f609;&#x1f609; 在csdn获奖荣誉: &#x1f3c…...

JAVA坦克大战游戏v3

JAVA坦克大战游戏v3 素材 bomb_3.gif bomb_2.gif bomb_1.gif 项目结构 游戏演示 MyTankGame3.java /*** 功能:坦克游戏的5.0[]* 1.画出坦克.* 2.我的坦克可以上下左右移动* 3.可以发射子弹,子弹连发(最多5)* 4.当我的坦克击中敌人坦克时&#xff0c;敌人就消失(爆炸的效…...

使用acme,自动续签免费的SSL,无忧http升级https

使用acme自动续签免费的SSL 安装acme.sh颁发域名将证书安装到nginx下配置nginx的ssl自动续签 这里只进行最简单的操作 安装acme.sh 进入你的用户目录&#xff0c;如果你使用root登陆&#xff0c;那么你的用户目录就是 /root/ curl https://get.acme.sh | sh -s emailmyexam…...

Uniapp笔记(五)uniapp语法4

本章目标 授权登录【难点、重点】 条件编译【理解】 小程序分包【理解】 一、授权登录 我的模块其实是两个组件&#xff0c;一个是登录组件&#xff0c;一个是用户信息组件&#xff0c;根据用户的登录状态判断是否要显示那个组件 1、登录的基本布局 <template><…...

编写一个yolov5的模型检测,只要运行后,就不结束,只要有文件放入到文件夹中,就去执行读取

编写一个yolov5的模型检测&#xff0c;只要运行后&#xff0c;就不结束&#xff0c;只要有文件放入到文件夹中&#xff0c;就去执行读取 import os import cv2 import torch from torchvision import transforms from PIL import Image from yolo.model import YOLO…...

vscode调试PHP代码

目录 准备工作ssh的连接以及配置调试 准备工作 1.首先你需要下载一个vscode 2.下载模块 你需要在VScode中去下载我们所需的两个模块PHP Debug以及remote -ssh 3.安装对应版本的xdebug 需要在xdebug的官方去进行分析&#xff0c;选择适合你自己版本的xdebug 去往官方&#x…...

js reverse实现数据的倒序

2023.8.25今天我学习了如何在数组顺序进行倒序排列&#xff0c;如&#xff1a; 原数组为&#xff1a; 我们只需要对数组使用reverse()方法 let demo [{id: 1, name: 一号},{id: 2, name: 二号},{id: 3, name: 三号},]demo.reverse()console.log(demo) 扩展&#xff1a; 当我…...

日常踩坑记录

本篇文章主要介绍一下最近的开发中用到的些小问题。问题不大&#xff0c;但有些小细节&#xff0c;记录一下&#xff0c;有遇到的朋友可以看一下&#xff0c;有更好的解决方法欢迎分享。 浏览器记住密码自动填充表单 这个问题我在火狐浏览器遇到了。我登录系统时选择了浏览器…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

Razor编程中@Html的方法使用大全

文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...

Git常用命令完全指南:从入门到精通

Git常用命令完全指南&#xff1a;从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...

CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!

本文介绍了一种名为AnomalyAny的创新框架&#xff0c;该方法利用Stable Diffusion的强大生成能力&#xff0c;仅需单个正常样本和文本描述&#xff0c;即可生成逼真且多样化的异常样本&#xff0c;有效解决了视觉异常检测中异常样本稀缺的难题&#xff0c;为工业质检、医疗影像…...

自然语言处理——文本分类

文本分类 传统机器学习方法文本表示向量空间模型 特征选择文档频率互信息信息增益&#xff08;IG&#xff09; 分类器设计贝叶斯理论&#xff1a;线性判别函数 文本分类性能评估P-R曲线ROC曲线 将文本文档或句子分类为预定义的类或类别&#xff0c; 有单标签多类别文本分类和多…...

多元隐函数 偏导公式

我们来推导隐函数 z z ( x , y ) z z(x, y) zz(x,y) 的偏导公式&#xff0c;给定一个隐函数关系&#xff1a; F ( x , y , z ( x , y ) ) 0 F(x, y, z(x, y)) 0 F(x,y,z(x,y))0 &#x1f9e0; 目标&#xff1a; 求 ∂ z ∂ x \frac{\partial z}{\partial x} ∂x∂z​、 …...