找出陣列遊戲的贏家 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

留言
avatar-img
留言分享你的想法!
avatar-img
小松鼠的演算法樂園
96會員
427內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
2024/10/06
題目敘述 Rank Transform of an Array 給定一個陣列arr,請根據數字的大小給予序號,序號值介於1~len( set(arr) )之間。 最大的數字給予最大的序號。 次大的數字給予次大的序號。 ...依此類推 最小的數字給予最小的序號1。
Thumbnail
2024/10/06
題目敘述 Rank Transform of an Array 給定一個陣列arr,請根據數字的大小給予序號,序號值介於1~len( set(arr) )之間。 最大的數字給予最大的序號。 次大的數字給予次大的序號。 ...依此類推 最小的數字給予最小的序號1。
Thumbnail
2024/10/01
題目敘述 Check If Array Pairs Are Divisible by k 給定一個長度為偶數的整數陣列arr,和一個整數k 。 我們想把陣列元素兩兩一組組成pair,使得每個pair的總和可以被k整除。 如果做得到,返回True。 如果不行,返回False。
Thumbnail
2024/10/01
題目敘述 Check If Array Pairs Are Divisible by k 給定一個長度為偶數的整數陣列arr,和一個整數k 。 我們想把陣列元素兩兩一組組成pair,使得每個pair的總和可以被k整除。 如果做得到,返回True。 如果不行,返回False。
Thumbnail
2024/09/29
My Calendar II 給定一個行事曆的class定義和行程安排的介面。 請完成下列function 1.建構子MyCalendarTwo() 2.boolean book(int start, int end) 在行事曆加入一項新行程,起始時間為start, 結束時間為end。
Thumbnail
2024/09/29
My Calendar II 給定一個行事曆的class定義和行程安排的介面。 請完成下列function 1.建構子MyCalendarTwo() 2.boolean book(int start, int end) 在行事曆加入一項新行程,起始時間為start, 結束時間為end。
Thumbnail
看更多
你可能也想看
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 vocus。
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 vocus。
Thumbnail
這篇內容,將會講解什麼是陣列,以及與陣列相關的知識。包括陣列的簡介、陣列的資料限制、陣列的維度、一維陣列、二維陣列。
Thumbnail
這篇內容,將會講解什麼是陣列,以及與陣列相關的知識。包括陣列的簡介、陣列的資料限制、陣列的維度、一維陣列、二維陣列。
Thumbnail
分享一個猜數字的遊戲題目,給予提示讓玩家找出正確的四位數密碼。
Thumbnail
分享一個猜數字的遊戲題目,給予提示讓玩家找出正確的四位數密碼。
Thumbnail
4-1 機率的基本概念 「投擲一枚硬幣,若正面朝上,則可得到五千元奬金。」 「投擲一骰子,若猜中所擲出的點數,猜中了,即可得到奬金六萬元。」 「自1-42個數字,選出6組號碼,全部猜中,即可得到頭彩!」 若參加以上任一種遊戲,只要花費五十塊錢,那參加哪種遊戲,可以得到的報酬比較高呢? 投擲
Thumbnail
4-1 機率的基本概念 「投擲一枚硬幣,若正面朝上,則可得到五千元奬金。」 「投擲一骰子,若猜中所擲出的點數,猜中了,即可得到奬金六萬元。」 「自1-42個數字,選出6組號碼,全部猜中,即可得到頭彩!」 若參加以上任一種遊戲,只要花費五十塊錢,那參加哪種遊戲,可以得到的報酬比較高呢? 投擲
Thumbnail
賓果這款遊戲我想大家應該都不陌生才對,常常會出現在各種活動場合,看誰最快達到指定的連線數量,誰就能得到獎品 賓果遊戲基本概念 這種賓果遊戲使用的卡片由一個5x5的方格組成,每個方格中填入1到25之間的數字,每張卡片上的數字排列是隨機的。 🕹️遊戲規則 準備工作:每個玩家獲得一張或多
Thumbnail
賓果這款遊戲我想大家應該都不陌生才對,常常會出現在各種活動場合,看誰最快達到指定的連線數量,誰就能得到獎品 賓果遊戲基本概念 這種賓果遊戲使用的卡片由一個5x5的方格組成,每個方格中填入1到25之間的數字,每張卡片上的數字排列是隨機的。 🕹️遊戲規則 準備工作:每個玩家獲得一張或多
Thumbnail
分享在網路上看到的陣列題目。通常 for...of 的 value 是陣列中的每個值,那如果我們在迭代中對陣列操作會發生什麼事? 題目來源:https://x.com/_jayphelps/status/1774640511158022335?s=20
Thumbnail
分享在網路上看到的陣列題目。通常 for...of 的 value 是陣列中的每個值,那如果我們在迭代中對陣列操作會發生什麼事? 題目來源:https://x.com/_jayphelps/status/1774640511158022335?s=20
Thumbnail
當更多選擇等於更多優勢的同時,是否我們應該著手的是為自己創造更多選擇,並減少對手的選擇。
Thumbnail
當更多選擇等於更多優勢的同時,是否我們應該著手的是為自己創造更多選擇,並減少對手的選擇。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News