leetcode如何找出第k最小距离
发表于:2025-12-01 作者:千家信息网编辑
千家信息网最后更新 2025年12月01日,这篇文章主要为大家展示了"leetcode如何找出第k最小距离",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"leetcode如何找出第k最小距离"这篇文章
千家信息网最后更新 2025年12月01日leetcode如何找出第k最小距离
这篇文章主要为大家展示了"leetcode如何找出第k最小距离",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"leetcode如何找出第k最小距离"这篇文章吧。
给定一个整数数组,返回所有数对之间的第 k 个最小距离。一对 (A, B) 的距离被定义为 A 和 B 之间的绝对差值。
示例 1:
输入:
nums = [1,3,1]
k = 1
输出:0
解释:
所有数对如下:
(1,3) -> 2
(1,1) -> 0
(3,1) -> 2
因此第 1 个最小距离的数对是 (1,1),它们之间的距离为 0。
提示:
2 <= len(nums) <= 10000.0 <= nums[i] < 1000000.1 <= k <= len(nums) * (len(nums) - 1) / 2.
对于第k小(大)的问题首先想到的是堆,对于第k小用大根堆。
1,二叉堆是一根完全二叉树,可以用数组实现,如果i%2==0 则父节点为i/2-1,否则为i/2
2,堆每次插入元素都是放到数组末尾,然后与父节点比较,如果比父节点大,则交换,一直到根节点。
3,删除元素,每次都是取出堆顶元素,然后将数组末尾元素放到堆顶,如果堆顶新元素小于任何一个孩子,则与孩子中交大者交换,直到叶子节点
4,对于本题,可以设置大小为k的大顶堆,当堆未满进行2,3步,如果堆满,比较插入元素和堆顶,如果比堆顶大不考虑,否则删除堆顶,然后插入堆尾。
func smallestDistancePair(nums []int, k int) int {if len(nums) < 0 {return 0}var h heaph.length=kfor i := 0; i < len(nums); i++ {for j := i + 1; j < len(nums); j++ {if nums[i] > nums[j] {h.handle(nums[i] - nums[j])} else {h.handle(nums[j] - nums[i])}}}return h.data[0]}type heap struct {data []intlength int}func (h *heap)handle(val int){if len(h.data)h.insert(val)}else{if valh.pop()h.insert(val)}}}func (h *heap) insert(val int) {h.data = append(h.data, val)i := len(h.data) - 1p := getP(i)for i > 0 && h.data[p] < h.data[i]{h.data[p], h.data[i] = h.data[i], h.data[p]i = pp = getP(i)}}func getP(i int) int {if i%2 == 0 {return i/2 - 1}return i / 2}func (h *heap) pop() int {if len(h.data) < 1 {return 0}top := h.data[0]h.data[0] = h.data[len(h.data)-1]h.data = h.data[0 : len(h.data)-1]i := 0for 2*i+1 < len(h.data) {if 2*i+2 < len(h.data) {if h.data[2*i+1] > h.data[2*i+2] {h.data[i], h.data[2*i+1] = h.data[2*i+1], h.data[i]i = 2*i + 1} else {h.data[i], h.data[2*i+2] = h.data[2*i+2], h.data[i]i = 2*i + 2}} else {h.data[i], h.data[2*i+1] = h.data[2*i+1], h.data[i]i = 2*i + 1}}return top}
5,这是一个内存和效率折衷的方案,本题要求效率,所以可以采用hash计数
func smallestDistancePair(nums []int, k int) int {if len(nums) < 0 {return 0}var a [1000000]intfor i := 0; i < len(nums); i++ {for j := i + 1; j < len(nums); j++ {if nums[i] > nums[j] {a[nums[i] - nums[j]]++} else {a[nums[j] - nums[i]]++}}}i:=0for ;i<1000000;i++{if a[i]>=k{return i}k-=a[i]}return -1}
以上是"leetcode如何找出第k最小距离"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!
元素
最小
节点
数组
之间
内容
篇文章
孩子
效率
末尾
本题
j++
学习
帮助
交大
内存
叶子
大小
差值
整数
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
中学生网络安全技术大赛
网易mc服务器透视挂
淘宝是什么软件开发出来的
网络技术应用题山东
数据库期末大作业设计主题
水磨沟区网络安全应急指挥中心
计算机网络技术如何提升职业能力
电脑编程是软件开发吗
具有代表性的历史文献数据库
自己搭建私人dns服务器犯法吗
数据库坏了能修吗
服务器能做阵列吗
美颜软件开发公司
创意天地软件开发
中级数据库vf证书怎么样
医院挂号预约系统数据库设计
mac客户端软件开发
石家庄软件开发服务价格
金蝶kis属于哪个数据库
小凯互联网科技有限公司
安信证劵app与服务器连接中断
淘宝服务器配什么dns
临沂市河东区网络技术
2021国家网络安全周主题征文
数据库按照时间增序
流放之路服务器大区列表
网络安全法的潜在影响
怎么对话网络安全专家
创建db2数据库登录用户
和龙软件开发生产公司