Off-by-one on range boundaries
Wrong move: Loop endpoints miss first/last candidate.
Usually fails on: Fails on minimal arrays and exact-boundary answers.
Fix: Re-derive loops from inclusive/exclusive ranges before coding.
Move from brute-force thinking to an efficient approach using array strategy.
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.
Constraints:
2 <= arr.length <= 1051 <= arr[i] <= 106arr contains distinct integers.1 <= k <= 109Problem summary: 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.
Start with the most direct exhaustive search. That gives a correctness anchor before optimizing.
Pattern signal: Array
[2,1,3,5,4,6,7] 2
[3,2,1] 10
Source-backed implementations are provided below for direct study and interview prep.
// Accepted solution for LeetCode #1535: Find the Winner of an Array Game
class Solution {
public int getWinner(int[] arr, int k) {
int mx = arr[0];
for (int i = 1, cnt = 0; i < arr.length; ++i) {
if (mx < arr[i]) {
mx = arr[i];
cnt = 1;
} else {
++cnt;
}
if (cnt == k) {
break;
}
}
return mx;
}
}
// Accepted solution for LeetCode #1535: Find the Winner of an Array Game
func getWinner(arr []int, k int) int {
mx, cnt := arr[0], 0
for _, x := range arr[1:] {
if mx < x {
mx = x
cnt = 1
} else {
cnt++
}
if cnt == k {
break
}
}
return mx
}
# Accepted solution for LeetCode #1535: Find the Winner of an Array Game
class Solution:
def getWinner(self, arr: List[int], k: int) -> int:
mx = arr[0]
cnt = 0
for x in arr[1:]:
if mx < x:
mx = x
cnt = 1
else:
cnt += 1
if cnt == k:
break
return mx
// Accepted solution for LeetCode #1535: Find the Winner of an Array Game
struct Solution;
use std::collections::VecDeque;
impl Solution {
fn get_winner(arr: Vec<i32>, k: i32) -> i32 {
let mut queue = VecDeque::new();
let k = k as usize;
let k = k.min(arr.len());
for x in arr {
queue.push_back(x);
}
loop {
let first = queue.pop_front().unwrap();
let second = queue.pop_front().unwrap();
if second > first {
queue.push_front(first);
queue.push_front(second);
} else {
queue.push_front(second);
queue.push_front(first);
}
let mut round = 0;
let winner = queue.pop_front().unwrap();
while let Some(first) = queue.pop_front() {
if first < winner {
queue.push_back(first);
round += 1;
if round == k {
return winner;
}
} else {
queue.push_front(first);
queue.push_front(winner);
break;
}
}
}
}
}
#[test]
fn test() {
let arr = vec![2, 1, 3, 5, 4, 6, 7];
let k = 2;
let res = 5;
assert_eq!(Solution::get_winner(arr, k), res);
let arr = vec![3, 2, 1];
let k = 10;
let res = 3;
assert_eq!(Solution::get_winner(arr, k), res);
let arr = vec![1, 9, 8, 2, 3, 7, 6, 4, 5];
let k = 7;
let res = 9;
assert_eq!(Solution::get_winner(arr, k), res);
let arr = vec![1, 11, 22, 33, 44, 55, 66, 77, 88, 99];
let k = 1000000000;
let res = 99;
assert_eq!(Solution::get_winner(arr, k), res);
}
// Accepted solution for LeetCode #1535: Find the Winner of an Array Game
function getWinner(arr: number[], k: number): number {
let mx = arr[0];
let cnt = 0;
for (const x of arr.slice(1)) {
if (mx < x) {
mx = x;
cnt = 1;
} else {
++cnt;
}
if (cnt === k) {
break;
}
}
return mx;
}
Use this to step through a reusable interview workflow for this problem.
Two nested loops check every pair or subarray. The outer loop fixes a starting point, the inner loop extends or searches. For n elements this gives up to n²/2 operations. No extra space, but the quadratic time is prohibitive for large inputs.
Most array problems have an O(n²) brute force (nested loops) and an O(n) optimal (single pass with clever state tracking). The key is identifying what information to maintain as you scan: a running max, a prefix sum, a hash map of seen values, or two pointers.
Review these before coding to avoid predictable interview regressions.
Wrong move: Loop endpoints miss first/last candidate.
Usually fails on: Fails on minimal arrays and exact-boundary answers.
Fix: Re-derive loops from inclusive/exclusive ranges before coding.