亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

golang中怎么利用leetcode 求最小的k個數

發布時間:2021-07-06 15:02:22 來源:億速云 閱讀:159 作者:Leah 欄目:大數據

本篇文章為大家展示了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個數,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

伊吾县| 武强县| 牙克石市| 嘉定区| 彭州市| 和顺县| 怀安县| 泗洪县| 修水县| 德州市| 杨浦区| 德惠市| 历史| 个旧市| 虞城县| 咸丰县| 田东县| 廉江市| 祥云县| 金门县| 延边| 双桥区| 丰城市| 平罗县| 甘泉县| 克东县| 凤凰县| 太白县| 都匀市| 凤庆县| 北川| 井冈山市| 石嘴山市| 屏东市| 武宁县| 德格县| 容城县| 张家界市| 尼木县| 龙川县| 靖安县|