Leetcode 1535 - Find the Winner of an Array Game

題目

Problem#

給你一個數字不重複的整數陣列 arr 和一個整數 k,每次比較陣列第一個(arr[0])與第二個元素(arr[1])的大小,贏的數字會在 index 0,輸的數字則移動到 arr 的最後,其他數字依序往前移動一格。當有個數字連續贏 k 場時比賽結束,回傳贏的數字。

測資限制#

  • $2 \le \text{len(arr)} \le 10^5$
  • $1 \le \text{arr[i]} \le 10^6$
  • $1 \le k \le 10^9$
  • 保證每場比賽一定會有贏者

想法#

  1. Naive: 直接模擬 $n$ 個數字去比賽,直到某個數字勝出 $k$ 次,且真的去模擬所有數字往左移動 $\rightarrow$ TLE $O(n^2k)$
  2. 因為每次比賽都是比較大的勝出,如果 $n >= k$ 則可以確定的是此時陣列第一個元素(arr[0])一定會是陣列中最大的數字(也就是 max(arr[0] ... arr[n-1])),因為每次都是找最大的,所以陣列每個數字都比過賽的話,自然贏者就是最大的數字 $\rightarrow$ 依舊 TLE $O(n^2)$ (因為 $n$ 蠻大)
  3. 每次模擬比賽可以不用真的模擬數字移動,透過觀察不難發現,數字是從左往右依序與當前最大的去比較,因此可以用 index $[2, n)$ 掃過陣列,去跟當前最大比賽,如果當前最大贏了,則勝場 +1;如果當前最大輸了,則最大換人,且勝場數重設回 1,如果勝場數 $>= k$ 時回傳當前最大數字。如果迴圈都掃完了,還沒有數字的勝場 $>= k$ 時,此時答案依舊是當前最大數字。

AC Code#

  • 時間複雜度: $\mathcal{O}(n)$
  • 空間複雜度: $\mathcal{O}(1)$

心得#

這題比想像中的麻煩