六六大順 能不能製造出順子? Hand of Straights 堆積/排序應用_Leetcode #846

閱讀時間約 5 分鐘

題目敘述 Hand of Straights

給定一個整數陣列hand代表手牌點數,和參數groupSize。

請問能不能每groupSize張牌一組,每一組都拼出順子?

例如[1,2,3,4,5] 是一組 groupSize=5的順子


如果可以,返回True。

如果無解,返回False。


測試範例

Example 1:

Input: hand = [1,2,3,6,2,3,4,7,8], groupSize = 3
Output: true
Explanation: Alice's hand can be rearranged as [1,2,3],[2,3,4],[6,7,8]

可以[1,2,3],[2,3,4],[6,7,8]
每一組都是三張牌的順子​

Example 2:

Input: hand = [1,2,3,4,5], groupSize = 4
Output: false
Explanation: Alice's hand can not be rearranged into groups of 4.

無解​

觀察 順子的組成

順子可以怎麼描述?

可以用最小牌+牌組長度groupSize描述

例如最小牌是1,牌組長度groupSize=5

那麼[1,2,3,4,5]就是對應的一組順子


例如最小牌是5,牌組長度groupSize=3

那麼[5,6,7]就是對應的一組順子


演算法 最小堆積/排序

紀錄每個點數的出現次數

我們就從小到大掃描每張牌,檢查能不能組成牌組長度為groupSize的順子即可。

這邊要使用minHeap或者sort排序皆可,這邊以minHeap最小堆作為示範。


如果某一回合有缺牌湊不出來,代表無解,直接返回False即可。


程式碼 最小堆積/排序

class Solution:
def isNStraightHand(self, hand: List[int], groupSize: int) -> bool:

## Simple case:
# Not full division of handcard
if len(hand) % groupSize > 0:
return False

## Simple case:
# One card for each group, can be satisfied always.
if groupSize == 1:
return True

## General cases
# Maintain a mainheap of poker card points
heapify(hand)

# Occurrence of each points
cnt = Counter(hand)

# Keep taking poker card if deck is not empty
while hand:

# Take current smallest card point
cur = heappop(hand)

# All card of this point have been used, skip this round.
if cnt[cur] == 0:
continue

# Check if we can make a straight with specified groupSize or not
for num in range(cur, cur + groupSize):
if cnt[num] == 0:
return False

# used one card, update occurrence of this point
cnt[num] -= 1

return True

複雜度分析

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

使用minHeap抽牌的look耗費O( n log n )時間。

如果用排序,那排序本身也耗費O( n log n )時間。


空間複雜度: O( n )

用字典去記錄每個點數的出現次數,所需空間為O(n)。


關鍵知識點

我們就從小到大掃描每張牌,檢查能不能組成牌組長度為groupSize的順子即可。

算是一道基本的流程模擬題。


Reference

[1] Hand of Straights - LeetCode

52會員
339內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
發表第一個留言支持創作者!
你可能也想看
三六六:「傷寒」脈滑而厥者,裡有熱也,「白虎湯」主之。「傷寒,脈滑而厥者」,傷寒邪入厥陰,滑脈是脈象往來流利,應指圓滑,如珠滾玉盤之狀,代表有濕、有熱、有實,雖然厥陰證患者手腳冰冷,裡寒很盛,但是當血裡面的水、津液不夠時,一樣會有經熱,血脈神經的熱。所以只要對證,不管病在太陽、少陽、陽明,都會有白虎湯證,患者會覺得喉嚨乾、嘴唇黏黏的(沒口水),身體熱的
avatar
鮪魚肚
2024-06-01
二六六:得病二三日,脈弱,無「太陽柴胡證」,煩躁,心下鞭,至四五日,雖能食,以「小承氣湯」少少與微和之,令小安。至...二六六:得病二三日,脈弱,無「太陽柴胡證」,煩躁,心下鞭,至四五日,雖能食,以「小承氣湯」少少與微和之,令小安。至五六日,與「小承氣湯」一升。若不大便,小便少者,雖不能食,但初頭鞕,後必溏,未定成鞕,攻之必溏。須小便利,矢定鞕,乃可攻之,宜「大承氣湯」。 「得病二三日,脈弱,無太陽柴胡證」,得病兩
avatar
鮪魚肚
2023-10-30
大武山腳下的三國志(六)--六堆民兵團舉旗時值大暑,八月。雲腳開始長毛,跑到東邊聚積在大武山前,越積越厚。力社庄的頭人阿和,看著天氣,擔憂地對大夥兒說: 「可能風颱抹來呀!阿正,去叫擱卡濟腳梟,搬欛石去河岸擋水」。 力社庄是一群來自漳州的農民,發現這裡土肥水豐,在此開基立業。但庄東邊是林后溪(今民治溪),北邊是東溪(今東港溪),一旦做大水,
Thumbnail
avatar
小克
2023-05-21
無敵六六六六是阿姨花6000元買下的一隻黑色吉娃娃,本來想取名六千,後來決定叫六六比較可愛。阿姨說牠看起來很可憐,很明顯生病了。如果她不買牠一定撐不過幾天。 六六小時候長的真醜,滿眼的眼屎(一直長出來)毛髮稀疏,後來經阿姨好好照顧後才開始變可愛。
avatar
艾姨
2023-05-18
【我的養病日誌】「好樂團-能不能請你別把我丟下」與我好樂團的音樂一直是我的養病良藥,無副作用,只是覺得出歌怎麼這麼慢,哈哈哈。 「能不能請你別把我丟下?」其實常常在心裡喊著這句話,可是怎麼樣都說不出口,我可以大喊「我愛你」,卻總是無法請託別人多體諒我一些,就像歌詞寫的「我知道不好的時候你們都將遠走」。 其實那都是“我以為”的「我知道」,也許沒有人會這
Thumbnail
avatar
黑天鵝
2023-04-19
六六大順大吉大利今天的領受蠻特別的, 或許是上帝給我的提醒! 感謝主❤️❤️❤️ 因為想要找小本本 來寫新的靈修內容, 剛好就看到有一本去年寫的 還可以繼續寫~ 有一篇是再講之前讀 提摩太前書時的紀錄~ 覺得這時候看到和激勵我! 提摩太六章1~10節 有一部分是在講 敬虔的心和貪財之間的關係 很被7、8節打到 因為
Thumbnail
avatar
joycewui儀
2023-02-23
六六:下之後,復發汗,晝日煩躁不得眠,夜而安靜,不嘔,不渴,無表證,脈沉微,身無大熱者,「乾薑附子湯」主之。乾薑附子湯方 乾薑3、生附子2 注意:注意:漢制劑量八兩等於現今的六錢,一錢等於3.75公克。上方方劑內容的劑量單位為「錢」。 乾薑一兩、附子一枚,生用去皮破八片。右二味,以水三升,煮取一升,去滓,頓服。
avatar
鮪魚肚
2022-09-10
我們能不能,把自己當作陌生人去觀察自己-黃誌群的一門講堂ep.7【黃誌群的一門講堂ep7】課程影片: 大家好,上一次跟大家分享到,就是當我們內在觀察的時候發現的第一個真相,就是喋喋不休的頭腦。我們的頭腦一直在說話,不是跟別人說話就是跟自己說話停不下來。 這就是我們目前的徵象,喋喋不休的頭腦。
Thumbnail
avatar
優人神鼓 黃誌群
2022-08-12
志工服務|能不能再唱一首歌對志工唯真而言,每次教學服務中「管理秩序」是她覺得最困難的地方。 偏鄉小學的小朋友們大多是原住民,他們總是非常活潑、熱情。志工就得時刻告訴自己,要秉持著自己的教學原則,可以輕鬆但不能隨便。 當然在熱鬧的時候,志工會跟著他們一起玩,但該嚴肅的時候就得嚴肅,不能動搖。
Thumbnail
avatar
德內儿國際兒童助學會
2021-09-09
數位時代不能靠「勤能補拙」! 楊光磊40年製造業經驗,助企業振翅爭雄無懼三星、曾與蔣尚義、梁孟松一同終結 IBM 技術霸權,言談溫文儒雅,卻頂著一身長達40年的專業硬氣。 楊光磊,加州大學柏克萊分校博士,前台積電資深研發處長,曾負責0.18/0.13微米與65奈米先進製程研發,並在「銅製程突破」戰役中將 IBM 逐出戰場。
Thumbnail
avatar
LeadAgileX
2021-05-07