leetcode215 數(shù)組中的第K個最大元素

題目描述:

BAA206089180489CA8DD88F8A831FFD2.jpg

思路1解析:

采用最小堆的方法: 建立一個含有K個元素的最小堆 因為堆得根是K個元素當(dāng)中最小的也就是說堆頂?shù)脑鼐褪沁@個所有元素中第K大小的的元素腾务,即堆中的K-1個元素都比堆頂元素大昙衅。

算法描述:

a. 建立一個最小堆胰柑。初始化時含有K個元素袖肥,最大只能含有K個元素裙犹,維護好現(xiàn)有堆得性質(zhì)

b. 遍歷輸入的數(shù)組撕捍,當(dāng)最小堆得元素個數(shù)小于K的時候加入到最小堆中骑篙,并重新維護堆的最小性質(zhì)

c. 當(dāng)最小堆的元素等于K的時候鸟蟹,遍歷的每個元素和堆根的元素比較如果比之更大則替換之乌妙,并重新維護堆得性質(zhì)

e. 遍歷結(jié)束后堆頂?shù)脑豱ums[0]就是答案

具體代碼

def findKthLargest_heap(self, nums, k):

  length=len(nums)

  def LEFT(i):

    return 2*i

  def PARENT(i):

  return i//2

  def RIGHT(i):

    return 2*i+1

  def shift_down(A,i,length): # 元素下沉算法

    l =LEFT(i)

    r =RIGHT(i)

    if l<= length and A[l-1]<A[i-1]:

    minimum = l

    else:

    minimum =i

    if r<=length and A[r-1]<A[minimum-1] :

    minimum = r

    if minimum != i :

    A[i-1],A[minimum-1] = A[minimum-1],A[i-1]

    shift_down(A,minimum,length)

  def build_min(A, k ):

    for i in range((k//2),0,-1):

    shift_down(A,i,k)

# 1\. 首先在原數(shù)組的基礎(chǔ)上構(gòu)建一個長度為K的最小堆

  build_min(nums,k)

# 2\. 從k+1開始1

#雙方的股份

for i in range(k+1,len(nums)+1):

  if nums[i-1]> nums[0]:

  nums[i-1],nums[0]=nums[0],nums[i-1]

  build_min(nums,k)

return nums[0]

思路2解析:

快速選擇排序的方法 :該方法為快速排序QS的部分選擇算法。具體做法為 :

1 分區(qū)函數(shù)構(gòu)建 建钥, 講數(shù)組分為兩部分藤韵,(隨機或者固定最后一位)選擇一個主元pivot 的元素,將數(shù)組分割成兩部 左半部分小于主元而右半部分大于主元 且返回主元的位置q , 即:

A[0..q-1]<A[q]<A[q+1. ..length(A )]

2.改進的快速排序算法:在原有的快速排序的遞歸算法當(dāng)中加入判斷 熊经,左側(cè)分區(qū)取得的劃分集合的個數(shù)等于K的話則說明則說明A[q]恰好是第i 個大的元素 之前有i-1個比他小 (i 為要找到位置)

  • 如果 i==K 則A [q] 就使我們要找到的第K大的元素 泽艘。
  • 如果 i<k 則說明第K大元素應(yīng)該在主元素分割的左側(cè)查找
  • 若果 i> k 則說明需要在主元的右側(cè)查找 ,且在這個區(qū)間的位置為 i-k的位置

遞歸查找直至找到K的大小元素為止

代碼:

 
def findKthLargest(self, nums, k):

  return self.select(nums,0,len(nums)-1,k)

def swap(self,a,b):

  t=a

  a=b

  b=t

def partition(self,A,p,r):

  pivol= A[r]

  i=p-1

  for j in range(p,r):

  if A[j]<=pivol:

  i += 1

  if i!=j:

  A[j], A[i] =A[i],A[j]

  A[r],A[i+1]=A[i+1],A[r]

  return i+1

def random_partition(self,A,p,r):

  ran=int(p+ (r-p)*random.random())

  A[r],A[ran]=A[ran],A[r]

  return self.partition(A,p,r)

def select(self,A,p,r,i):

  if p==r:

    return A[p]

  q= self.random_partition(A,p,r)

  k= q-p+1

  if k ==i :

    return A[q]

  elif i<k :

    return self.select(A,p,q-1,i)

  else:

 return self.select(A,q+1,r,i-k)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末镐依,一起剝皮案震驚了整個濱河市匹涮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌槐壳,老刑警劉巖然低,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異宏粤,居然都是意外死亡脚翘,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門绍哎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來来农,“玉大人,你說我怎么就攤上這事崇堰∥钟冢” “怎么了涩咖?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長繁莹。 經(jīng)常有香客問我檩互,道長,這世上最難降的妖魔是什么咨演? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任闸昨,我火速辦了婚禮,結(jié)果婚禮上薄风,老公的妹妹穿的比我還像新娘饵较。我一直安慰自己,他們只是感情好遭赂,可當(dāng)我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布循诉。 她就那樣靜靜地躺著,像睡著了一般撇他。 火紅的嫁衣襯著肌膚如雪茄猫。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天困肩,我揣著相機與錄音划纽,去河邊找鬼。 笑死僻弹,一個胖子當(dāng)著我的面吹牛阿浓,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蹋绽,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼芭毙,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了卸耘?” 一聲冷哼從身側(cè)響起退敦,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蚣抗,沒想到半個月后侈百,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡翰铡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年钝域,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锭魔。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡例证,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出迷捧,到底是詐尸還是另有隱情织咧,我是刑警寧澤胀葱,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站笙蒙,受9級特大地震影響抵屿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜捅位,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一轧葛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧绿渣,春花似錦朝群、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽誉帅。三九已至淀散,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蚜锨,已是汗流浹背档插。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留亚再,地道東北人郭膛。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像氛悬,于是被迫代替她去往敵國和親则剃。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,871評論 2 354