您好,登錄后才能下訂單哦!
本篇文章為大家展示了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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。