Given an integer array arr
of distinct integers and an integer k
.
A game will be played between the first two elements of the array (i.e. arr[0]
and arr[1]
). In each round of the game, we compare arr[0]
with arr[1]
, the larger integer wins and remains at position 0
and the smaller integer moves to the end of the array. The game ends when an integer wins k
consecutive rounds.
Return the integer which will win the game.
It is guaranteed that there will be a winner of the game.
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.
Example 3:
Input: arr = [1,9,8,2,3,7,6,4,5], k = 7 Output: 9
Example 4:
Input: arr = [1,11,22,33,44,55,66,77,88,99], k = 1000000000 Output: 99
Constraints:
2 <= arr.length <= 10^5
1 <= arr[i] <= 10^6
arr
contains distinct integers.1 <= k <= 10^9
Solution 1: Simulation with a List
Observation : if k >= n – 1, ans = max(arr)
Time complexity: O(n+k)
Space complexity: O(n)
C++
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
class Solution { public: int getWinner(vector<int>& arr, int k) { if (k >= arr.size()) return *max_element(begin(arr), end(arr)); int win = 0; list<int> a(begin(arr), end(arr)); while (true) { auto it0 = begin(a); auto it1 = next(it0); if (*it0 > *it1) { a.splice(a.end(), a, it1); ++win; } else { swap(it0, it1); a.splice(a.end(), a, it1); win = 1; } if (win == k) return *it0; } return -1; } }; |
Solution 2: One pass
Since smaller numbers will be put to the end of the array, we must compare the rest of array before meeting those used numbers again. And the winner is monotonically increasing. So we can do it in one pass, just keep the largest number seen so far. If we reach to the end of the array, arr[0] will be max(arr) and it will always win no matter what k is.
Time complexity: O(n)
Space complexity: O(1)
C++
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
class Solution { public: int getWinner(vector<int>& arr, int k) { int winner = arr[0]; int win = 0; for (int i = 1; i < arr.size(); ++i) { if (arr[i] > winner) { winner = arr[i]; win = 0; } if (++win == k) break; } return winner; } }; |
Java
1 2 3 4 5 6 7 8 9 10 11 12 |
class Solution { public int getWinner(int[] arr, int k) { int winner = arr[0]; int win = 0; for (int i = 1; i < arr.length && win < k; ++i, ++win) if (arr[i] > winner) { winner = arr[i]; win = 0; } return winner; } } |
Python3
1 2 3 4 5 6 7 8 9 10 |
class Solution: def getWinner(self, arr: List[int], k: int) -> int: winner = arr[0] win = 0 for x in arr[1:]: if x > winner: winner, win = x, 0 win += 1 if win == k: break return winner |
请尊重作者的劳动成果,转载请注明出处!花花保留对文章/视频的所有权利。
如果您喜欢这篇文章/视频,欢迎您捐赠花花。
If you like my articles / videos, donations are welcome.
Be First to Comment