每日一题 --- 数组中的第 K 个最大元素[力扣][Go]

数组中的第 K 个最大元素

题目:数组中的第 K 个最大元素

给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。

请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。

示例 1:

输入: [3,2,1,5,6,4] 和 k = 2
输出: 5

示例 2:

输入: [3,2,3,1,2,4,5,5,6] 和 k = 4
输出: 4

提示:

  • 1 <= k <= nums.length <= 104
  • -104 <= nums[i] <= 104

方法一:

使用快速排序,排好序后找到第K大的元素。

func findKthLargest(nums []int, k int) int {if len(nums) < k {return -1}qSort(nums)return nums[len(nums)-k]
}func qSort(nums []int) {quickSort(nums, 0, len(nums)-1)
}// 快速排序算法
func quickSort(nums []int, min, max int) {if min < max {pos := partition(nums, min, max)quickSort(nums, min, pos-1)quickSort(nums, pos+1, max)}
}func partition(nums []int, l, r int) int {base := nums[l]for l < r {for l < r && nums[r] >= base {r--}nums[l] = nums[r]for l < r && nums[l] <= base {l++}nums[r] = nums[l]}nums[l] = basereturn l
}

方法二:

使用堆排序,排好序后,调整K次大根堆,然后取出元素值

func findKthLargest(nums []int, k int) int {// 实现卫兵nums = append([]int{0}, nums...)Len := len(nums)buildMaxHeap(nums, Len-1)for i := Len - 1; i >= Len-k; i-- {nums[1], nums[i] = nums[i], nums[1]maxHeapAdjust(nums, 1, i-1)}return nums[Len-k]
}// 建堆
func buildMaxHeap(nums []int, len int) {for i := len / 2; i > 0; i-- {maxHeapAdjust(nums, i, len)}
}// 调整堆, k为根元素,从k开始往下调整
func maxHeapAdjust(nums []int, k, len int) {nums[0] = nums[k]for i := 2 * k; i <= len; i *= 2 {if i < len && nums[i] < nums[i+1] {i++}if nums[i] <= nums[0] {break} else {nums[k] = nums[i]k = i}}nums[k] = nums[0]
}

方法一和方法二都是采取,先排序再取值的办法。时间复杂度为O(n*log n)。

其实我们可以改进下方法一:利用分治思想将时间复杂度期望降至O(1)。

具体思想讲解:4.3分治寻找第k小元素_哔哩哔哩_bilibili

在这里插入图片描述

方法三:

分治法,与上面思想不同的是,我们不执着于找中位数,而是采用随机分治,当随机到的基数正好为第K大时,直接返回。详细讲解参考力扣题解部分。

func findKthLargest(nums []int, k int) int {if len(nums) < k {return -1}return qSort(nums, len(nums)-k)
}func qSort(nums []int, index int) int {rand.Seed(time.Now().UnixNano())return quickSort(nums, 0, len(nums)-1, index)
}// 快速排序算法
func quickSort(nums []int, min, max, index int) int {randN := rand.Int()%(max-min+1) + minpos := partition(nums, min, max, randN)if pos == index {return nums[pos]} else if pos < index {return quickSort(nums, pos+1, max, index)} else {return quickSort(nums, min, pos-1, index)}}func partition(nums []int, l, r, random int) int {nums[random], nums[l] = nums[l], nums[random]base := nums[l]for l < r {for l < r && nums[r] >= base {r--}nums[l] = nums[r]for l < r && nums[l] <= base {l++}nums[r] = nums[l]}nums[l] = basereturn l
}

理论上期望时间复杂度为O(n),求证:算法导论中文版.pdf · FaithLight/books - Gitee.com,定位:《算法导论》9.2

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

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

相关文章

设计模式-装饰者模式在Java中使用实例-打印发票装饰抬头和脚注

场景 设计模式-装饰者模式在Java中的使用示例&#xff1a; 设计模式-装饰者模式在Java中的使用示例_java装饰者模式例子-CSDN博客 上面装饰器的调用示例如下 AbstarctComputer computer;//要买1台电脑computer new BaseComputer();//加一个内存条computer new MemoryDecor…

Ansys Speos | Light Expert Group探测器组使用技巧

附件下载 联系工作人员获取附件 概述 相机挡板的设计需要在光路的不同位置同步多个照度图&#xff0c;以尽量减少杂散光。2023R2 Speos提供了一种新的探测器&#xff0c;用于高阶杂散光分析&#xff0c;可以同时对多个探测器进行光线追迹。Light Expert工具可以即时过滤3D视…

MySQL之MVCC如何实现可重复读和提交读

(/≧▽≦)/~┴┴ 嗨~我叫小奥 ✨✨✨ &#x1f440;&#x1f440;&#x1f440; 个人博客&#xff1a;小奥的博客 &#x1f44d;&#x1f44d;&#x1f44d;&#xff1a;个人CSDN ⭐️⭐️⭐️&#xff1a;Github传送门 &#x1f379; 本人24应届生一枚&#xff0c;技术和水平有…

mysql安装及操作

一、Mysql 1.1 MySQL数据库介绍 1.1.1 什么是数据库DB&#xff1f; DB的全称是database&#xff0c;即数据库的意思。数据库实际上就是一个文件集合&#xff0c;是一个存储数据的仓库&#xff0c;数据库是按照特定的格式把数据存储起来&#xff0c;用户可以对存储的数据进行…

查看 Debian 系统版本的 6 种方式

本篇文章将为大家介绍 6 种查看 Dibian 系统发行版本号的方式。 1. 使用 lsb_release 命令 lsb_release 命令可用于查看 Linux 发行版操作系统的具体版本。它可能尚未安装在你的操作系统中&#xff0c;因此你需要先安装它。运行以下命令来安装 lsb_release&#xff1a; apt-…

Qt/QML编程之路:画线及倒车影响(48)

前言: 倒车影像中有一个属性比较实用,那就是倒车线,这条线很明显会在视频图像上叠加显示,或者说在视频上面一个图层画的线。这里有一个画线的Qt示例,用于在一个scene上画一个对角线: #include "mainwindow.h" #include <QApplication> #include <QtW…

Antd Pagination 解决点击重置按钮后分页器不刷新问题

问题描述&#xff1a; 原本&#xff1a; 问题&#xff1a; 解决方法&#xff1a; const [resetPageSize, setResetPageSize] useState(10); setResetPageSize(10) pageSize{resetPageSize} pageSizeChange //初始化const [resetPageSize, setResetPageSize] useState(10);//…

排序(冒泡/快速/归并)

冒泡排序 时间复杂度为 O(n^2) 原理 比较相邻的元素. 如果第一个比第二个大,就交换他们两个.依次比较每一对相邻的元素—>结果 : 最后的元素是这组数中最大的重复上述步骤 , 除了最后一个[]因为最后一个已经是排好序的了(这组数中最大的那个)]持续对越来越少的元素进行如上…

【真题解析】题目 3151: 蓝桥杯2023年第十四届省赛真题-飞机降落【C++ DFS 超详解注释版本】

爆搜冥想 暴力枚举每一辆飞机对于每一个飞机都只存在两种情况&#xff0c;可以降落和不可以降落如果可以降落&#xff0c;计算降落后最早可以降落的时间pre&#xff0c;作为下一次递归的传参如果不可以降落&#xff0c;枚举下一辆飞机 注意这辆的降落有盘旋这种量子叠加态&…

GIS与Python机器学习:开创地质灾害风险评价新纪元

地质灾害是指全球地壳自然地质演化过程中&#xff0c;由于地球内动力、外动力或者人为地质动力作用下导致的自然地质和人类的自然灾害突发事件。由于降水、地震等自然作用下&#xff0c;地质灾害在世界范围内频繁发生。我国除滑坡灾害外&#xff0c;还包括崩塌、泥石流、地面沉…

Jira 软件缺陷管理 (软件测试)

内容来源&#xff1a;总结黑马课程 1.软件缺陷信息 2.创建缺陷问题 2.1 缺陷模板 2.2 创建缺陷问题模板

SAR成像及其干扰样式

SAR成像及其干扰样式 RD算法CS算法wk算法SAR干扰技术射频噪声干扰调幅噪声干扰调频噪声干扰调相噪声干扰噪声卷积干扰乘积干扰移频干扰需要的联系qq&#xff1a;2329738917 RD算法 CS算法 wk算法 SAR干扰技术 射频噪声干扰 调幅噪声干扰 调频噪声干扰 调相噪声干扰 噪声卷积干…