本篇文章为大家展示了golang中怎么利用leetcode 求最小的k个数,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。
示例 1:
输入:arr = [3,2,1], k = 2
输出:[1,2] 或者 [2,1]
示例 2:
输入:arr = [0,1,2,1], k = 1
输出:[0]
限制:
0 <= k <= arr.length <= 10000
0 <= arr[i] <= 10000
解题思路
1,本题其实就是实现大根堆
2,堆的性质:
A,堆逻辑上是一棵完全二叉树,实现上是一个数组
B,对于节点i,左孩子是2*i+1 ,右孩子是 2*i+2,父亲节点是 (i-1)/2
3,未达到堆容量时,需要建堆。把元素加到数组末尾,然后调整堆:
如果当前节点值比父亲节点值大,交换元素,然后递归调整父亲节点
4,达到堆容量后,比较元素和堆顶元素大小,如果比堆顶元素小,替换堆顶元素,然后调整堆:
和左右孩子中较大者交换,然后递归调整堆。
代码实现
func getLeastNumbers(arr []int, k int) []int {
if k<1{
return []int{}
}
if len(arr)<=k{
return arr
}
h:=heap{cap:k}
for i:=0;i<k;i++{
h.data=append(h.data,arr[i])
h.build(i)
}
for i:=k;i<len(arr);i++{
if arr[i]<h.data[0]{
h.data[0]= arr[i]
h.heaplify(0)
}
}
return h.get()
}
type heap struct{
cap int
data []int
}
func(this*heap)heaplify(i int){
l:=2*i+1
r:=2*i+2
if l>=this.cap{
return
}
if r>=this.cap{
if this.data[l]>this.data[i]{
this.data[l],this.data[i]=this.data[i],this.data[l]
}
return
}
if this.data[l]>this.data[r]{
if this.data[l]>this.data[i]{
this.data[l],this.data[i]=this.data[i],this.data[l]
this.heaplify(l)
}
}else{
if this.data[r]>this.data[i]{
this.data[r],this.data[i]=this.data[i],this.data[r]
this.heaplify(r)
}
}
}
func (this*heap)build(i int){
p:=(i-1)/2
if p>=0 && this.data[p]<this.data[i]{
this.data[p],this.data[i]=this.data[i],this.data[p]
this.build(p)
}
}
func(this*heap)get()[]int{
return this.data
}
上述内容就是golang中怎么利用leetcode 求最小的k个数,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。