中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

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

万山特区| 永州市| 青浦区| 广宗县| 虹口区| 疏勒县| 保亭| 通化县| 永修县| 普安县| 九江市| 博罗县| 长宁区| 专栏| 庄浪县| 会理县| 河津市| 碌曲县| 红河县| 舒城县| 平利县| 高平市| 醴陵市| 丰原市| 镶黄旗| 东台市| 七台河市| 中西区| 峨山| 阿鲁科尔沁旗| 肇州县| 金秀| 渝中区| 景洪市| 江华| 监利县| 崇义县| 平远县| 平泉县| 洞口县| 区。|