滄海一粟 第k小的分數(最小堆+生成應用) Leetcode #786

閱讀時間約 5 分鐘

題目敘述

輸入給定一個已經從小到大排序好,而且彼此互質的整數陣列
請問任取兩數分別當作分子、分母,第k小的分數是多少?

輸出請以[分子,分母]的形式回傳答案。


原本的英文題目敘述


測試範例

Example 1:

Input: arr = [1,2,3,5], k = 3
Output: [2,5]
Explanation: The fractions to be considered in sorted order are:
1/5, 1/3, 2/5, 1/2, 3/5, and 2/3.
The third fraction is 2/5.

Example 2:

I
nput: arr = [1,7], k = 1
Output: [1,7]

約束條件

Constraints:

  • 2 <= arr.length <= 1000

陣列長度介於2~1000之間。

  • 1 <= arr[i] <= 3 * 10^4

每個元素介於1~三萬之間。

  • arr[0] == 1

第一個元素保證是1

  • arr[i] is a prime number for i > 0.

第一個元素之外的都是質數。

  • All the numbers of arr are unique and sorted in strictly increasing order.

數字彼此都不同,而且嚴格遞增排序。

  • 1 <= k <= arr.length * (arr.length - 1) / 2

k 落在 C(n,2) 以內的數字。


演算法 最小堆 + 最佳化生成

比較小的分數一定是真分數,真分數就是分子比分母小

例如:

1/2, 1/3, 1/5, 2/3, 2/5 ...等等


因此可以過濾掉另一半假分數的情況。

例如:

2/1, 3/1, 5/1, 3/2, 5/2 ...等等


一開始先建立一個空的最小堆,接著初始化成1/a, a是所有題目供應互質的整數。

問第k小,所以就是pop次,每次pop的時候,動態生成下一個最接近的分數往上成長。

第k次pop拿到的,恰好就是第k小的分數


說明:
第一次pop拿到的會是第一小的分數,
第二次pop拿到的會是第二小的分數,
...
第k次pop拿到的的會是第k小的分數


這是來自於minHeap最小堆的特性,pop的元素具有由小到大遞增的性質


程式碼 最小堆 + 最佳化生成

class Solution:
def kthSmallestPrimeFraction(self, arr: List[int], k: int) -> List[int]:

minHeap = []

# Initialize to 1/a, where a is integer in input array
for i in range(len(arr)):
heapq.heappush(minHeap,(1/arr[i], 0, i) )

# Pop k times, then latest item is the k-th smallest fraction
for _ in range(k):
fraction, numerator, denominator = heapq.heappop( minHeap )

if numerator + 1 < denominator:
# Grow to next closet fraction
heapq.heappush(minHeap, ( (arr[numerator+1])/arr[denominator], numerator+1, denominator) )

# k-th smallest fraction
return [ arr[numerator], arr[denominator] ]

複雜度分析

時間複雜度: O(k log n)

k次pop,每次動態生成對應的adjustment需要log(n)的時間成本。


空間複雜度: O(n)

初始化之後,minHeap堆積大小為O(n)。

每次迭代最多一進一出,minHeap堆積大小空間成本為O(n)


關鍵知識點

找前k大的元素,可以用最大堆maxHeap來滿足

同樣道理

找前k小的元素,可以用最小堆minHeap來滿足

當k比較小的時候,堆積演算法會比sorting來的有效率,
因為sorting至少要花費O( n lo n)


Reference

[1] K-th Smallest Prime Fraction - LeetCode

88會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
發表第一個留言支持創作者!
題目敘述 輸入給定一個整數陣列,分別代表每小朋友的快樂值。 要求我們選擇其中最快樂的k位小朋友,累加這群小朋友的快樂值。 有一個特殊的規則,第一位選中的小朋友快樂值不變。 接著,第二位選中的小朋友快樂值-1 再接著,第三位選中的小朋友快樂值-2 快樂值扣到只剩下0就不再往下扣 .
題目敘述 輸入給定一個整數陣列,分別代表每位運動員在比賽中的成績。 分數最高的給予金牌"Gold Medal" 分數次高的給予金牌"Silver Medal" 分數第三高的給予金牌"Bronze Medal" 剩餘的名次依照順序給予"4", "5", ..., "n" 的編號。 輸出時以字串
題目敘述 輸入給定一個鏈結串列,整體看代表一個十進位的數字,各別看每個節點代表每個digit,分別從最高位~最低位個位數。 要求我們把原本的數字乘以二,並且以鏈結串列的形式返回答案。 原本的英文題目敘述
題目敘述 題目給定一個鏈結串列中的節點Node,要求我們從鏈結串列中刪除該節點。 題目保證該節點不是tail node。 題目要求我們in-place原位操作。 原本的英文題目敘述 測試範例 Example 1: Input: head = [4,5,1,9], node = 5
題目敘述 輸入給定一個鏈結串列的head node。 要求我們進行化簡,只要某個節點的右手邊存在比較大的節點,就刪除掉。 例如 5->2->13->3 5的右手邊有13,所以5刪除掉。 2的右手邊有13,所以2刪除掉。 13的右手邊沒有更大的節點,所以13留著。 3的右手邊沒有更大
題目敘述 給定一個非零陣列nums,請找出陣列裡面 最大的對偶數 是誰? 如果無解,請返回-1 對偶數定義: 整數k的對偶數是-k 例如: 99 和 -99互為對偶數。
題目敘述 輸入給定一個整數陣列,分別代表每小朋友的快樂值。 要求我們選擇其中最快樂的k位小朋友,累加這群小朋友的快樂值。 有一個特殊的規則,第一位選中的小朋友快樂值不變。 接著,第二位選中的小朋友快樂值-1 再接著,第三位選中的小朋友快樂值-2 快樂值扣到只剩下0就不再往下扣 .
題目敘述 輸入給定一個整數陣列,分別代表每位運動員在比賽中的成績。 分數最高的給予金牌"Gold Medal" 分數次高的給予金牌"Silver Medal" 分數第三高的給予金牌"Bronze Medal" 剩餘的名次依照順序給予"4", "5", ..., "n" 的編號。 輸出時以字串
題目敘述 輸入給定一個鏈結串列,整體看代表一個十進位的數字,各別看每個節點代表每個digit,分別從最高位~最低位個位數。 要求我們把原本的數字乘以二,並且以鏈結串列的形式返回答案。 原本的英文題目敘述
題目敘述 題目給定一個鏈結串列中的節點Node,要求我們從鏈結串列中刪除該節點。 題目保證該節點不是tail node。 題目要求我們in-place原位操作。 原本的英文題目敘述 測試範例 Example 1: Input: head = [4,5,1,9], node = 5
題目敘述 輸入給定一個鏈結串列的head node。 要求我們進行化簡,只要某個節點的右手邊存在比較大的節點,就刪除掉。 例如 5->2->13->3 5的右手邊有13,所以5刪除掉。 2的右手邊有13,所以2刪除掉。 13的右手邊沒有更大的節點,所以13留著。 3的右手邊沒有更大
題目敘述 給定一個非零陣列nums,請找出陣列裡面 最大的對偶數 是誰? 如果無解,請返回-1 對偶數定義: 整數k的對偶數是-k 例如: 99 和 -99互為對偶數。
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
【她們與她們身後蒼白的海】 暑熱惱人,不禁試圖再回到明石大橋的那個冬季。 隧道之間,車聲迴響似雨,嘈嘈鬧過睏睡的耳膜。
清晨,我一如往常穿梭在人潮洶湧的街頭,彷彿處生於巨大的迷宮中,那些高聳的大樓與華夏,讓人一不注意就會迷路。走在喧囂的馬路邊,覺得自己的聲音都被淹沒了。我才發覺我就如同沙粒般渺小,僅是浩瀚世界中的一枚芥子,仍有許多事物等著我去探索。
Thumbnail
當詢問者號再次安全降落在月球背面時,檮杌滄海暗暗鬆了一口氣。 原先都是在陰曆初一那幾天執行任務,趁著月影幽暗不明、被無數觀星者發現的機率趨近於零之時,降落在月球上。這次卻臨時加開了航次,偏偏選定了陰曆八月十四、月球上那反射的太陽光正好能晃瞎人的眼時,在這該受詛咒的時間登陸月球___雖然是背面,但還是
Thumbnail
你和我像無邊無際的宇宙裡,兩顆不起眼的星體。 是某個星球上,靠得很近的雙星, 偶然的機會,我們的光錐曾彼此重疊, 而你永遠改變了我的星軌, 你散發出的光芒,像是檢驗我和宇宙的反照律特徵, 顯示出我的明亮和黑暗, 兩顆星球互相吸引,跨越洛希極限, 你就快要將我吞噬, 我們過往的軌跡的幾何反照率是多少,
Thumbnail
【人生啊!不就是這麼一回事】 {滄海一聲笑} 在職場上,跟與自己同年的同事都笑稱為「同學」。 那日,同學語意言簡,用心至深的說著,她的過去,可寫幾篇狗血八點檔。 這回首過往的滄海一聲笑,笑得蒼涼,笑得灑脫,笑得渾身是快活。 年輕的女孩說,許多食物,真的是年齡到了,她才知道那可口的滋味。 輕聲
Thumbnail
對於「施呼嚨」這個人,我原本無意記錄。世風日下,為當權者護航的人所在多有,何足掛齒?但是她針對蔡英文總統的〔論文門事件〕,長期以來所做的理盲護航和展現出來的傲慢態度,卻反而讓這整起事件更值得被深究和探討。
Thumbnail
吳其穎,現任台大醫院兒科住院醫師,外號——蒼藍鴿。除了他自己所說的,在醫院作為最基層的輸出人力外,也許大家對他更為熟悉的是這樣的背景:Youtube頻道32萬訂閱者,Podcast健康類頻道常駐第一,方格子專欄近3000位追蹤者的白袍醫師,這麼斜槓,也讓很多人發出來自內心深層的疑問:「怎麼做到的?」
法律人修法的速度,總是趕不上時代的進步,腦袋灌上水泥,食古不化,也是常見的批評,這些似乎也沒啥好辯解的。 . 看著財經界犀利賺錢,每個人將投資理論說得頭頭是道,二十年前剛轉入財經界的我,實在是讚嘆不已。......
Thumbnail
官方釋出的經濟數據,面對二十年來新經濟奇蹟,我卻只能水煮香蕉皮沾醬油吃,我決定滄海一聲笑!
Thumbnail
粟米草因種子「細小如粟」而得名,台產粟米草科粟米草屬植物有2種,一為粟米草,另一種為光葉粟米草,它們都屬於一年生草本植物。莖多分枝且剛勁如鉤,俗稱「鐵鉤草」,特別的是它們沒有「花瓣」,我們肉眼所看見的是「萼片」張開的模樣。
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
【她們與她們身後蒼白的海】 暑熱惱人,不禁試圖再回到明石大橋的那個冬季。 隧道之間,車聲迴響似雨,嘈嘈鬧過睏睡的耳膜。
清晨,我一如往常穿梭在人潮洶湧的街頭,彷彿處生於巨大的迷宮中,那些高聳的大樓與華夏,讓人一不注意就會迷路。走在喧囂的馬路邊,覺得自己的聲音都被淹沒了。我才發覺我就如同沙粒般渺小,僅是浩瀚世界中的一枚芥子,仍有許多事物等著我去探索。
Thumbnail
當詢問者號再次安全降落在月球背面時,檮杌滄海暗暗鬆了一口氣。 原先都是在陰曆初一那幾天執行任務,趁著月影幽暗不明、被無數觀星者發現的機率趨近於零之時,降落在月球上。這次卻臨時加開了航次,偏偏選定了陰曆八月十四、月球上那反射的太陽光正好能晃瞎人的眼時,在這該受詛咒的時間登陸月球___雖然是背面,但還是
Thumbnail
你和我像無邊無際的宇宙裡,兩顆不起眼的星體。 是某個星球上,靠得很近的雙星, 偶然的機會,我們的光錐曾彼此重疊, 而你永遠改變了我的星軌, 你散發出的光芒,像是檢驗我和宇宙的反照律特徵, 顯示出我的明亮和黑暗, 兩顆星球互相吸引,跨越洛希極限, 你就快要將我吞噬, 我們過往的軌跡的幾何反照率是多少,
Thumbnail
【人生啊!不就是這麼一回事】 {滄海一聲笑} 在職場上,跟與自己同年的同事都笑稱為「同學」。 那日,同學語意言簡,用心至深的說著,她的過去,可寫幾篇狗血八點檔。 這回首過往的滄海一聲笑,笑得蒼涼,笑得灑脫,笑得渾身是快活。 年輕的女孩說,許多食物,真的是年齡到了,她才知道那可口的滋味。 輕聲
Thumbnail
對於「施呼嚨」這個人,我原本無意記錄。世風日下,為當權者護航的人所在多有,何足掛齒?但是她針對蔡英文總統的〔論文門事件〕,長期以來所做的理盲護航和展現出來的傲慢態度,卻反而讓這整起事件更值得被深究和探討。
Thumbnail
吳其穎,現任台大醫院兒科住院醫師,外號——蒼藍鴿。除了他自己所說的,在醫院作為最基層的輸出人力外,也許大家對他更為熟悉的是這樣的背景:Youtube頻道32萬訂閱者,Podcast健康類頻道常駐第一,方格子專欄近3000位追蹤者的白袍醫師,這麼斜槓,也讓很多人發出來自內心深層的疑問:「怎麼做到的?」
法律人修法的速度,總是趕不上時代的進步,腦袋灌上水泥,食古不化,也是常見的批評,這些似乎也沒啥好辯解的。 . 看著財經界犀利賺錢,每個人將投資理論說得頭頭是道,二十年前剛轉入財經界的我,實在是讚嘆不已。......
Thumbnail
官方釋出的經濟數據,面對二十年來新經濟奇蹟,我卻只能水煮香蕉皮沾醬油吃,我決定滄海一聲笑!
Thumbnail
粟米草因種子「細小如粟」而得名,台產粟米草科粟米草屬植物有2種,一為粟米草,另一種為光葉粟米草,它們都屬於一年生草本植物。莖多分枝且剛勁如鉤,俗稱「鐵鉤草」,特別的是它們沒有「花瓣」,我們肉眼所看見的是「萼片」張開的模樣。