遊戲互動題 移除顏色相同的字卡 Leetcode #2038

閱讀時間約 6 分鐘
raw-image

這題的題目在這裡

題目敘述

題目會給定我們一個輸入陣列,裡面的字母A和字母B分別代表兩種顏色的卡片。

假如某張卡片的左右都是相同的,例如AAA,Alice可以抽掉中間那張A。

同樣的,假如某張卡片的左右都是相同的,例如BBB,Bob可以抽掉中間那張B。

請問Alice和Bob輪流玩抽卡遊戲,每回合都用最優解的方式去玩。Alice和Bob輪流各抽一張卡片,Alice先手。
假如輪到某個回合,已經無法再抽出卡牌,則當下這個玩家就輸了。

請問最後是誰贏?
如果Alice贏的話回傳True,如果是Bob贏回傳False。


測試範例

Example 1:

Input: colors = "AAABABB"
Output: true
Explanation:
AAABABB -> AABABB
Alice moves first.
She removes the second 'A' from the left since that is the only 'A' whose neighbors are both 'A'.

Now it's Bob's turn.
Bob cannot make a move on his turn since there are no 'B's whose neighbors are both 'B'.
Thus, Alice wins, so return true.

Example 2:

Input: colors = "AA"
Output: false
Explanation:
Alice has her turn first.
There are only two 'A's and both are on the edge of the line, so she cannot move on her turn.
Thus, Bob wins, so return false.

Example 3:

Input: colors = "ABBBBBBBAAA"
Output: false
Explanation:
ABBBBBBBAAA -> ABBBBBBBAA
Alice moves first.
Her only option is to remove the second to last 'A' from the right.

ABBBBBBBAA -> ABBBBBBAA
Next is Bob's turn.
He has many options for which 'B' piece to remove. He can pick any.

On Alice's second turn, she has no more pieces that she can remove.
Thus, Bob wins, so return false.



約束條件

Constraints:

  • 1 <= colors.length <= 105
  • colors consists of only the letters 'A' and 'B'

演算法

其實仔細模擬幾個範例之後可以發現,Alice和Bob的局面在開局後就固定下來,勝負已知,而且彼此的操作不影響對方

為什麼?

下文中的'這著記號只是為了向讀者說明抽了哪張卡片,其實還是原本的顏色。

比如說
AA'ABBBAA
這局Alice抽掉左方的A'之後變成

AABB'BAA
這局再換Bob抽掉中間的B',之後變成

AABBAA
此時Alice 無法再操作,判定Bob獲勝。Bob上一局也無法讓Alice左右兩側的AA和AA互相串連成更大一組的AAAA。

其他的例子也是,開局時的A、B分布已經固定,之後兩個玩家的操作已經無法改變局面。

關鍵就在於AAA和BBB總共有多少個,如果AAA的數目比BBB還多,那麼Alice最後必勝。反之,就是Bob必勝。


程式碼

class Solution:
 def winnerOfGame(self, colors: str) -> bool:
  
  n = len(colors)

  # number of pieces alice can take
  # number of pieces bob bob can take
  alice, bob = 0, 0

  for i in range(1, n-1):

   if colors[i-1] == colors[i] and colors[i] == colors[i+1]:

    if colors[i] == "A":
     alice += 1
    
    else:
     bob += 1

  # Judge whether Alice can win or not
  return alice > bob
   



複雜度分析

時間複雜度:

O( n ) 從左到右掃描一次,掃描並且計算AAA和BBB的總數目。

空間複雜度:

O(1) 只有使用固定的臨時變數,所耗費的記憶體空間為常數級別O(1)


關鍵知識點

這題的關鍵在於先模擬幾個小範例,發現局面在開局已經固定,勝負已分,之後的抽卡操作並不影響勝負局面

關鍵在於AAA和BBB的總數。

如果 AAA的數目 > BBB的數目,代表Alice每次可以從AAA抽走一張A,相對的Bob能抽B的次數比較少,兩人輪流,一定是Bob先走到死局,所以Alice必勝。

有點類似腦筋急轉彎的題目,如果太早落入一定要使用DP動態規劃,或者Greedy貪心法的先入為主刻板印象,反而落入陷阱。


Reference:

[1] Python O(n) by pattern scan - Remove Colored Pieces if Both Neighbors are the Same Color - LeetCode

avatar-img
88會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
題目給定一個已排序的輸入陣列,陣列裡面的數字自分別代表每篇論文的被引用數。 要求我們計算h-index。 h-index的定義: 找一個最大的h值,使得有h篇論文,個別論文的被引用數都 大於等於 h
題目給定一個輸入陣列,陣列裡面的數字自分別代表每篇論文的被引用數。 要求我們計算h-index。 h-index的定義: 找一個最大的h值,使得有h篇論文,個別論文的被引用數都 大於等於 h
題目會給定兩個參數,一個是底數x,一個是次方n。要求我們計算出x^n。 要求實作myPow(self, x: float, n: int) -> float 函數的內部邏輯。 也就是說,不可以呼叫程式語言內建計算指數的library
1. 競賽題 或者 面試題 Medium Hard 以上題目,一開始在第一時間想不出解題思路,或者最佳解是很平常的事情。 通過官方解答、討論區的高手分享解題,進而學到新的解題思路,或者更泛用的演算法框架,就是最大的收穫。 2. 但是Easy分類的題目,通常就是該領域最基礎的題目,應該要
題目會給定我們一個陣列,要求我們找出裡面出現次數最多的數字。 出現次數最多的數字也就是我們在統計上所謂的 眾數 mode
題目會給一個輸入陣列,裡面的數字分別代表每個index對應到的高度,要求我們計算山峰與低谷的數目,總共有多少個。 山峰 Hill: 比最靠近高度不相同的兩個鄰居的高度還要高。 低谷 Valley:比最靠近高度不相同的兩個鄰居的高度還要低。
題目給定一個已排序的輸入陣列,陣列裡面的數字自分別代表每篇論文的被引用數。 要求我們計算h-index。 h-index的定義: 找一個最大的h值,使得有h篇論文,個別論文的被引用數都 大於等於 h
題目給定一個輸入陣列,陣列裡面的數字自分別代表每篇論文的被引用數。 要求我們計算h-index。 h-index的定義: 找一個最大的h值,使得有h篇論文,個別論文的被引用數都 大於等於 h
題目會給定兩個參數,一個是底數x,一個是次方n。要求我們計算出x^n。 要求實作myPow(self, x: float, n: int) -> float 函數的內部邏輯。 也就是說,不可以呼叫程式語言內建計算指數的library
1. 競賽題 或者 面試題 Medium Hard 以上題目,一開始在第一時間想不出解題思路,或者最佳解是很平常的事情。 通過官方解答、討論區的高手分享解題,進而學到新的解題思路,或者更泛用的演算法框架,就是最大的收穫。 2. 但是Easy分類的題目,通常就是該領域最基礎的題目,應該要
題目會給定我們一個陣列,要求我們找出裡面出現次數最多的數字。 出現次數最多的數字也就是我們在統計上所謂的 眾數 mode
題目會給一個輸入陣列,裡面的數字分別代表每個index對應到的高度,要求我們計算山峰與低谷的數目,總共有多少個。 山峰 Hill: 比最靠近高度不相同的兩個鄰居的高度還要高。 低谷 Valley:比最靠近高度不相同的兩個鄰居的高度還要低。
你可能也想看
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
題目敘述 Dota2 的世界有兩個陣營:Radiant(天輝)和 Dire(夜魘) Dota2 元老院由兩派的元老組成。現在元老院希望對一個 Dota2 遊戲裡的改變作出決定。他們以一個回合制的過程的進行投票。在每一輪中,每一位元老都可以行使兩項權利中的一項: 禁止一名元老的權利:元老
Thumbnail
20幾年前開始注意卓銘順的創作,著眼於他居家及工作室前的那個小小的池塘。池子裡收集了他所重視的臺灣原生生物,在進入他的工作室前,他會耐心地一一為你介紹池子內的生態種類,就像他用鈷藍一筆一筆彩繪在陶瓷器上一般。當時他用青花工筆彩繪結合陶版成形完成各種實用容器,茶具、花器、陶燈、香薰器等,融合他自己的小
Thumbnail
題目會給我們兩個陣列left, right 分別代表每隻螞蟻所在的初始位置 和 方向,n代表木板長度。每隻螞蟻每秒鐘前進一單位長度。 問我們,每隻螞蟻從初始位置出發,0秒起算,當兩隻螞蟻相遇時,會互相掉頭,往相反方向前進,問最後一隻螞蟻掉落木板的時候是幾秒鐘?
Thumbnail
題目會給定我們一個輸入陣列,裡面的字母A和字母B分別代表兩種顏色的卡片。 假如某張卡片的左右都是相同的,例如AAA,Alice可以抽掉中間那張A。 同樣的,假如某張卡片的左右都是相同的,例如BBB,Bob可以抽掉中間那張B。 請問Alice和Bob輪流玩抽卡遊戲, 請問最後是誰贏?
Thumbnail
「遊戲」與其他藝術設計作品最重要的差別是什麼?是「互動性」。 「餘料建造」是讓玩家開發武器與物品功能而感到興奮的方式,但他同時也對地圖的探索體驗有很正面功效。撿東西不再是撿東西,而成了一種實驗;實驗建造的過程就等於是對遊戲地圖產生互動。
Thumbnail
小大人大小事 『繪本我先讀』|EP001   1~2歲的小大人開始探索興趣階段,可以很多元的閱讀,但是如果利用有遊戲和互動性的繪本做引導,在共讀的路上更能進入狀況,但是怎麼挑選繪本才會有遊戲性和互動性呢?   一開始挑選有人物互動而且人物關係是小大人孰悉的,這樣會更有帶入感喔,例如關於爸爸媽媽的故事
Thumbnail
如果最近炙熱的天氣讓你不想外出遊玩,或許來長榮海事博物館認識世界海洋知識、玩互動遊戲也是不錯的選擇喔!
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
遊戲化行銷結合遊戲元素,使顧客在購物過程中獲得樂趣,從而提高品牌參與度與互動性。透過設定明確的目標與獎勵、融入遊戲挑戰以及善用社群媒體,品牌能有效吸引顧客並深化他們對品牌的好感。本文將探討如何制定有效的遊戲化行銷策略,並分享成功案例,幫助品牌提升市場競爭力。
Thumbnail
題目敘述 Dota2 的世界有兩個陣營:Radiant(天輝)和 Dire(夜魘) Dota2 元老院由兩派的元老組成。現在元老院希望對一個 Dota2 遊戲裡的改變作出決定。他們以一個回合制的過程的進行投票。在每一輪中,每一位元老都可以行使兩項權利中的一項: 禁止一名元老的權利:元老
Thumbnail
20幾年前開始注意卓銘順的創作,著眼於他居家及工作室前的那個小小的池塘。池子裡收集了他所重視的臺灣原生生物,在進入他的工作室前,他會耐心地一一為你介紹池子內的生態種類,就像他用鈷藍一筆一筆彩繪在陶瓷器上一般。當時他用青花工筆彩繪結合陶版成形完成各種實用容器,茶具、花器、陶燈、香薰器等,融合他自己的小
Thumbnail
題目會給我們兩個陣列left, right 分別代表每隻螞蟻所在的初始位置 和 方向,n代表木板長度。每隻螞蟻每秒鐘前進一單位長度。 問我們,每隻螞蟻從初始位置出發,0秒起算,當兩隻螞蟻相遇時,會互相掉頭,往相反方向前進,問最後一隻螞蟻掉落木板的時候是幾秒鐘?
Thumbnail
題目會給定我們一個輸入陣列,裡面的字母A和字母B分別代表兩種顏色的卡片。 假如某張卡片的左右都是相同的,例如AAA,Alice可以抽掉中間那張A。 同樣的,假如某張卡片的左右都是相同的,例如BBB,Bob可以抽掉中間那張B。 請問Alice和Bob輪流玩抽卡遊戲, 請問最後是誰贏?
Thumbnail
「遊戲」與其他藝術設計作品最重要的差別是什麼?是「互動性」。 「餘料建造」是讓玩家開發武器與物品功能而感到興奮的方式,但他同時也對地圖的探索體驗有很正面功效。撿東西不再是撿東西,而成了一種實驗;實驗建造的過程就等於是對遊戲地圖產生互動。
Thumbnail
小大人大小事 『繪本我先讀』|EP001   1~2歲的小大人開始探索興趣階段,可以很多元的閱讀,但是如果利用有遊戲和互動性的繪本做引導,在共讀的路上更能進入狀況,但是怎麼挑選繪本才會有遊戲性和互動性呢?   一開始挑選有人物互動而且人物關係是小大人孰悉的,這樣會更有帶入感喔,例如關於爸爸媽媽的故事
Thumbnail
如果最近炙熱的天氣讓你不想外出遊玩,或許來長榮海事博物館認識世界海洋知識、玩互動遊戲也是不錯的選擇喔!