找出陣列遊戲的贏家 Find the Winner of an Array Game Leetcode_1535

閱讀時間約 4 分鐘
raw-image

這題的題目在這裡:

題目敘述

題目會給們一個陣列,還有一個k值。

接著進行比大小的遊戲,規則如下:

每次取陣列前兩個元素值比大小比較小的會被重新安排到陣列最後方,陣列前兩個元素值比大小,同樣的,比較小的會被重新安排到陣列最後方。依此類推,反覆進行比大小的遊戲。

請問第一個能連贏k回合的是哪一個數字?


測試範例

Example 1:

Input: arr = [2,1,3,5,4,6,7], k = 2
Output: 5
Explanation: Let's see the rounds of the game:
Round | arr | winner | win_count
1 | [2,1,3,5,4,6,7] | 2 | 1
2 | [2,3,5,4,6,7,1] | 3 | 1
3 | [3,5,4,6,7,1,2] | 5 | 1
4 | [5,4,6,7,1,2,3] | 5 | 2
So we can see that 4 rounds will be played and 5 is the winner because it wins 2 consecutive games.

Example 2:

Input: arr = [3,2,1], k = 10
Output: 3
Explanation: 3 will win the first 10 rounds consecutively.

約束條件

Constraints:

  • 2 <= arr.length <= 105
  • 1 <= arr[i] <= 106
  • arr contains distinct integers.
  • 1 <= k <= 109

演算法

第一時間可能會想要找一個queue或是deque等等FIFO相關的資料結構來進行遊戲模擬。

但是,其實仔細觀察遊行進行規律,可以發現,每次比較小的數字都會被重新安排在最後面。而且,比較小的數字不會是最終的贏家

因此,我們可以做一個線性掃描,從左邊掃描到最右邊,找出連贏K回合的贏家數字

一開始初始化,假設贏家是第一個數字。

接著,和後續的數字進行兩兩比大小的遊戲,統計連贏的回合數,最終連贏K回合的就是這個遊戲的贏家


程式碼

class Solution:
 def getWinner(self, arr: List[int], k: int) -> int:
  
  # Simple cases
  if k >= len(arr):
   return max(arr)

  # General cases
  winnwer = arr[0]
  win_count = 0

  # Scan possible competitor from left to right
  for i in range(1, len(arr) ):

   
   if arr[i] > winnwer:
    # Competitor wins, update new winner
    winnwer = arr[i]
    win_count = 1
   else:
    # Competitor loses
    win_count += 1

   if win_count == k:
    break
  
  return winnwer

複雜度分析

時間複雜度: O( n)
一次線性掃描,掃描長度和陣列長度一樣長O(n)。

空間複雜度: O(1)
使用到的變數都是固定尺寸的臨時變數,皆為常數級別O(1)。


關鍵知識點

觀察遊行進行規律,可以發現,每次比較小的數字都會被重新安排在最後面。而且,比較小的數字不會是最終的贏家

因此,我們可以做一個線性掃描,從左邊掃描到最右邊,找出連贏K回合的贏家數字


Reference:

[1] Python O(n) by linear scan on possible competitor [w/ Comment] - Find the Winner of an Array Game - LeetCode

86會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
發表第一個留言支持創作者!
題目會給我們兩個陣列left, right 分別代表每隻螞蟻所在的初始位置 和 方向,n代表木板長度。每隻螞蟻每秒鐘前進一單位長度。 問我們,每隻螞蟻從初始位置出發,0秒起算,當兩隻螞蟻相遇時,會互相掉頭,往相反方向前進,問最後一隻螞蟻掉落木板的時候是幾秒鐘?
題目會給我們個陣列target,問我們從整數串流中1~n之中,如何透過stack 的 push和pop來模擬生成target指定的形式?
題目會給一顆二元樹,要求我們計算節點值 和 子樹平均值相等的node有幾個。
題目會給定一個字串s,裡面都是由()*打散交錯而成。 配對規則 左括弧 ( 可以和 右括弧 ) 配對,其中 左括弧一定要在右括弧的左邊。 左括弧 ( 也可以和 *星號 配對,其中 左括弧一定要在*星號的左邊。 問我們給定的輸入字串s是否為合法括弧配對字串?
題目會給我們一個輸入陣列,陣列裡面存放的是每個元素做XOR之後的前綴累積值。 要求我們從累積值還原出原本的陣列元素值。 XOR前綴累積值定義: pref[i] = arr[0] ^ arr[1] ^ ... ^ arr[i]
題目會給定一組規則,要求我們計算給定長度下的母音直線排列有幾種?
題目會給我們兩個陣列left, right 分別代表每隻螞蟻所在的初始位置 和 方向,n代表木板長度。每隻螞蟻每秒鐘前進一單位長度。 問我們,每隻螞蟻從初始位置出發,0秒起算,當兩隻螞蟻相遇時,會互相掉頭,往相反方向前進,問最後一隻螞蟻掉落木板的時候是幾秒鐘?
題目會給我們個陣列target,問我們從整數串流中1~n之中,如何透過stack 的 push和pop來模擬生成target指定的形式?
題目會給一顆二元樹,要求我們計算節點值 和 子樹平均值相等的node有幾個。
題目會給定一個字串s,裡面都是由()*打散交錯而成。 配對規則 左括弧 ( 可以和 右括弧 ) 配對,其中 左括弧一定要在右括弧的左邊。 左括弧 ( 也可以和 *星號 配對,其中 左括弧一定要在*星號的左邊。 問我們給定的輸入字串s是否為合法括弧配對字串?
題目會給我們一個輸入陣列,陣列裡面存放的是每個元素做XOR之後的前綴累積值。 要求我們從累積值還原出原本的陣列元素值。 XOR前綴累積值定義: pref[i] = arr[0] ^ arr[1] ^ ... ^ arr[i]
題目會給定一組規則,要求我們計算給定長度下的母音直線排列有幾種?
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
Thumbnail
股市有非常多噪音,一方面有持續看好經濟與產業前景的觀點,認為股市只是漲多休息,另一方面也會有觀點認為是較大幅的波段修正或趨勢轉變,但這些噪音的背後經常是人性與情緒因素,不論看好或看壞,都必須要能回歸到投資邏輯裡找出具體的參考訊號是甚麼?
np.unique 是 NumPy 庫中的一個函數,用於找出陣列中的相同的數值。這個函數可以單純過濾只取唯一值出來,也可以選擇性地返回這些唯一值在原始陣列中的中的索引和計數。 函式 unique = np.unique(ar, return_index=False, return_inver
在網路交友過程中,建立信任需要時間。 透過逐漸深入的交流和討論共同興趣和目標,可以更清楚地了解對方的動機
Thumbnail
題目會給們一個陣列,還有一個k值。 接著進行比大小的遊戲,規則如下: 每次取陣列前兩個元素值比大小,比較小的會被重新安排到陣列最後方,陣列前兩個元素值比大小,同樣的,比較小的會被重新安排到陣列最後方。依此類推,反覆進行比大小的遊戲。 請問第一個能連贏k回合的是哪個數字?
Thumbnail
佛經好難懂怎麼辦❓ 沒關係,讓我們來看看通俗易懂的佛教藝術─經變圖。 經變圖,始於南北朝,透過隨文走圖的藝術讓人明白經典的意涵,大多數以繪畫類型表現,並呈現在紙、絹或是壁畫上。
Thumbnail
撒哇滴卡🙏(泰語”大家好”) 今天怎麼會用泰文和大家打招呼呢? 阿~原來要和大家介紹位於本館金佛殿,來自泰國的金佛像。 這尊是東南亞最高的金佛坐像,在2004年泰國十九世僧王90大壽,製作了19尊金佛,將其中一獻給了星雲大師,象徵南、北傳佛教的融合。 摳坤咖🙏(泰語”謝謝大家”)
Thumbnail
抬頭挺胸、提起精神! 想到學生時代教官在朝會用宏亮的聲音提醒全校同學,哈,身體就不由自主挺直起來。 相較於佛門「四威儀」的生活禮儀,就非常有氣質,怎麼說呢? 佛門中的四威儀就是行如風、立如松、坐如鐘、臥如弓,在行、立、坐、臥間流露出涵養和風範。
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
Thumbnail
股市有非常多噪音,一方面有持續看好經濟與產業前景的觀點,認為股市只是漲多休息,另一方面也會有觀點認為是較大幅的波段修正或趨勢轉變,但這些噪音的背後經常是人性與情緒因素,不論看好或看壞,都必須要能回歸到投資邏輯裡找出具體的參考訊號是甚麼?
np.unique 是 NumPy 庫中的一個函數,用於找出陣列中的相同的數值。這個函數可以單純過濾只取唯一值出來,也可以選擇性地返回這些唯一值在原始陣列中的中的索引和計數。 函式 unique = np.unique(ar, return_index=False, return_inver
在網路交友過程中,建立信任需要時間。 透過逐漸深入的交流和討論共同興趣和目標,可以更清楚地了解對方的動機
Thumbnail
題目會給們一個陣列,還有一個k值。 接著進行比大小的遊戲,規則如下: 每次取陣列前兩個元素值比大小,比較小的會被重新安排到陣列最後方,陣列前兩個元素值比大小,同樣的,比較小的會被重新安排到陣列最後方。依此類推,反覆進行比大小的遊戲。 請問第一個能連贏k回合的是哪個數字?
Thumbnail
佛經好難懂怎麼辦❓ 沒關係,讓我們來看看通俗易懂的佛教藝術─經變圖。 經變圖,始於南北朝,透過隨文走圖的藝術讓人明白經典的意涵,大多數以繪畫類型表現,並呈現在紙、絹或是壁畫上。
Thumbnail
撒哇滴卡🙏(泰語”大家好”) 今天怎麼會用泰文和大家打招呼呢? 阿~原來要和大家介紹位於本館金佛殿,來自泰國的金佛像。 這尊是東南亞最高的金佛坐像,在2004年泰國十九世僧王90大壽,製作了19尊金佛,將其中一獻給了星雲大師,象徵南、北傳佛教的融合。 摳坤咖🙏(泰語”謝謝大家”)
Thumbnail
抬頭挺胸、提起精神! 想到學生時代教官在朝會用宏亮的聲音提醒全校同學,哈,身體就不由自主挺直起來。 相較於佛門「四威儀」的生活禮儀,就非常有氣質,怎麼說呢? 佛門中的四威儀就是行如風、立如松、坐如鐘、臥如弓,在行、立、坐、臥間流露出涵養和風範。