六六大順 能不能製造出順子? 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

avatar-img
90會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
給定兩個輸入整數陣列, 若在兩個陣列遇到相同的數字可以連成一線, 但是有規定連線不可和別的連線有交叉, 請問最多可以形成幾條連線? 解答中探討了演算法化簡的技巧和DP模型, 可以透過演算法化簡的技巧, 把這題映射到原本已經學會的Longest Common Subsequence的DP模型來解開。
給定一個字串陣列,請把它們所共有的字元伴隨著出現次數輸出。這篇文章介紹如何使用字典統計出現次數,和字典取交集的方法來解決此問題。並提供了複雜度分析和關鍵知識點。
給定一個字串s,以s擁有的字元製造迴文字串。要能製造出的迴文字串長度最長是多少,觀察迴文字串不外乎兩種模式對稱部分 + 核心字元 + 對稱部分,其中,核心字元在正中央出現一次,或者 對稱部分 + 對稱部分。使用演算法統計出現次數並推理出盡可能充分利用每個字元的迴文字串製造方法。
給定一個二維的二元矩陣,計算正方形的最大面積。利用DP演算法及最大化正方形邊長的方法,遍歷矩陣,釐清DP初始狀態並推導出DP狀態轉移關係式。複雜度分析說明了時間複雜度和空間複雜度。關鍵知識點是找出最大的正方形邊長。
Append Characters to String to Make Subsequence 給定兩個字串s和字串t。 請計算最少的字元串接數量是多少,串接在s的尾端,使得t是s的子序列。 測試範例 Example 1: Input: s = "coaching", t =
通過 取捨與否的最佳策略 來獲得 最高的分數。文章中運用了類似House Robbery的DP模型來解決這個問題。通過演算法化簡的技巧,將這個問題化簡到 相鄰物不可同時選擇的DP模型。同時,強烈建議同時複習House Robbery,熟悉DP演算法框架和掌握演算法化簡的技巧。
給定兩個輸入整數陣列, 若在兩個陣列遇到相同的數字可以連成一線, 但是有規定連線不可和別的連線有交叉, 請問最多可以形成幾條連線? 解答中探討了演算法化簡的技巧和DP模型, 可以透過演算法化簡的技巧, 把這題映射到原本已經學會的Longest Common Subsequence的DP模型來解開。
給定一個字串陣列,請把它們所共有的字元伴隨著出現次數輸出。這篇文章介紹如何使用字典統計出現次數,和字典取交集的方法來解決此問題。並提供了複雜度分析和關鍵知識點。
給定一個字串s,以s擁有的字元製造迴文字串。要能製造出的迴文字串長度最長是多少,觀察迴文字串不外乎兩種模式對稱部分 + 核心字元 + 對稱部分,其中,核心字元在正中央出現一次,或者 對稱部分 + 對稱部分。使用演算法統計出現次數並推理出盡可能充分利用每個字元的迴文字串製造方法。
給定一個二維的二元矩陣,計算正方形的最大面積。利用DP演算法及最大化正方形邊長的方法,遍歷矩陣,釐清DP初始狀態並推導出DP狀態轉移關係式。複雜度分析說明了時間複雜度和空間複雜度。關鍵知識點是找出最大的正方形邊長。
Append Characters to String to Make Subsequence 給定兩個字串s和字串t。 請計算最少的字元串接數量是多少,串接在s的尾端,使得t是s的子序列。 測試範例 Example 1: Input: s = "coaching", t =
通過 取捨與否的最佳策略 來獲得 最高的分數。文章中運用了類似House Robbery的DP模型來解決這個問題。通過演算法化簡的技巧,將這個問題化簡到 相鄰物不可同時選擇的DP模型。同時,強烈建議同時複習House Robbery,熟悉DP演算法框架和掌握演算法化簡的技巧。
你可能也想看
Google News 追蹤
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
初學者最易學習的韋特塔羅系統,首先,拿到一副新的塔羅牌如何開牌? 「開牌」,不侷限於任何儀式,心誠則靈。
Thumbnail
中國跳棋的棋盤有6個角,最多可供6人進行遊戲,每個人把各自同顏色的棋子擺滿一個角,按照規則輪流走棋,以最早全部抵達並擺滿對角為優勝。 若是2人或4人對局,那麼將棋子放在相對的角上;3人對局則將棋子互相間隔一個角擺放以平均分布;6人對局為將所有角擺滿。因為平衡性要求,不宜進行5人遊戲。 每方棋
Thumbnail
星盤棋 雙方各只有用十五枚基本棋。起始布置雙方各有三子環狀交錯放在六頂角上。雙方的基本棋子則各剩下十二枚,放在玩家旁作為棋庫。 每回合玩家從棋庫取一己子,將之從棋盤外黑點推入一棋格。該行方向緊密的棋子也會隨此動作一起移動一棋格。要是該行已充滿棋子,則無法推入。 當己方棋子有四枚以上緊密連線,
Thumbnail
多米諾骨牌 遊戲進行: 此遊戲順時針輪流出牌,手中擁有最大重複點數牌(左右兩格點數相同為重複點數牌)的人先出牌,需出重複點數那張牌。 如果玩家手中皆無重複點數牌,則由年紀最小的玩家開始出牌。 接著出牌的玩家必須出與桌面上骨牌相同點數的牌,並且接續相同點數之隔壁,形成骨牌接龍。
Thumbnail
這篇文章介紹了排列和組閤中的錯位排列和排容原理,並提供了一種相對樸實的解題方法。透過例子詳細解釋了選擇情況下的數學原理,讓讀者能夠理解並吸收。文章通過課堂上難以推敲的題目,提出了一個相對簡單的方式來解題。 圖片選自@pngtree
Thumbnail
最近每天都有同學在解題社群提問這類型的問題,有些同學甚至po出解答來提問,表示看了解答卻還是看不懂,畢竟有時候「詳解」也沒辦法完整表達所有觀念。 排列組合是一門龐大的章節,許多人聞排組而色變,但排列組合的本質其實還是「窮舉法」,也就是把全部的可能通通列出來,只是很多地方我們可以透過計算讓窮舉變得更
Thumbnail
切滾球: 飛少滾多 12法則: 飛滾比 7號桿>1:5(7+5=12) 9號桿>1:3(9+3=12) P桿> 1:2 54°Wedge>1:1 越長桿桿面角度越小,越穩定 掌握桿把,左手低右肩高,肘貼胸肋, 桿身垂直地面(桿頭跟部離地),桿身握短。 像推桿一樣對準方向控制大小
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
初學者最易學習的韋特塔羅系統,首先,拿到一副新的塔羅牌如何開牌? 「開牌」,不侷限於任何儀式,心誠則靈。
Thumbnail
中國跳棋的棋盤有6個角,最多可供6人進行遊戲,每個人把各自同顏色的棋子擺滿一個角,按照規則輪流走棋,以最早全部抵達並擺滿對角為優勝。 若是2人或4人對局,那麼將棋子放在相對的角上;3人對局則將棋子互相間隔一個角擺放以平均分布;6人對局為將所有角擺滿。因為平衡性要求,不宜進行5人遊戲。 每方棋
Thumbnail
星盤棋 雙方各只有用十五枚基本棋。起始布置雙方各有三子環狀交錯放在六頂角上。雙方的基本棋子則各剩下十二枚,放在玩家旁作為棋庫。 每回合玩家從棋庫取一己子,將之從棋盤外黑點推入一棋格。該行方向緊密的棋子也會隨此動作一起移動一棋格。要是該行已充滿棋子,則無法推入。 當己方棋子有四枚以上緊密連線,
Thumbnail
多米諾骨牌 遊戲進行: 此遊戲順時針輪流出牌,手中擁有最大重複點數牌(左右兩格點數相同為重複點數牌)的人先出牌,需出重複點數那張牌。 如果玩家手中皆無重複點數牌,則由年紀最小的玩家開始出牌。 接著出牌的玩家必須出與桌面上骨牌相同點數的牌,並且接續相同點數之隔壁,形成骨牌接龍。
Thumbnail
這篇文章介紹了排列和組閤中的錯位排列和排容原理,並提供了一種相對樸實的解題方法。透過例子詳細解釋了選擇情況下的數學原理,讓讀者能夠理解並吸收。文章通過課堂上難以推敲的題目,提出了一個相對簡單的方式來解題。 圖片選自@pngtree
Thumbnail
最近每天都有同學在解題社群提問這類型的問題,有些同學甚至po出解答來提問,表示看了解答卻還是看不懂,畢竟有時候「詳解」也沒辦法完整表達所有觀念。 排列組合是一門龐大的章節,許多人聞排組而色變,但排列組合的本質其實還是「窮舉法」,也就是把全部的可能通通列出來,只是很多地方我們可以透過計算讓窮舉變得更
Thumbnail
切滾球: 飛少滾多 12法則: 飛滾比 7號桿>1:5(7+5=12) 9號桿>1:3(9+3=12) P桿> 1:2 54°Wedge>1:1 越長桿桿面角度越小,越穩定 掌握桿把,左手低右肩高,肘貼胸肋, 桿身垂直地面(桿頭跟部離地),桿身握短。 像推桿一樣對準方向控制大小