Find the Winner of an Array Game

Updated on 29 May, 2025
Find the Winner of an Array Game header image

Problem Statement

In this scenario, we're given an array arr composed of distinct integers and a number k. The task involves a sequential game conducted between the first two elements of the array: arr[0] and arr[1]. In each game round, the two elements are compared, and the larger one wins the round, maintaining its position at the start of the array, while the loser shifts to the array's end. This game persists until an integer secures k consecutive wins. The objective is to determine which integer will reach the mark of k consecutive wins first. Considering the array's elements are unique and the range of values within, there is an assurance of a definitive winner by the game's conclusion.

Examples

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

Approach and Intuition

The handling of the problem can be visualized as a process where iteratively the leading pair in the array contest and post their comparison, restructured based on the winner:

  1. Initialize two counters: one for the current winner and another for the count of consecutive wins (current_winner and win_count).
  2. As the larger of the first two elements becomes current_winner, compare it with the next in line. If current_winner prevails, increment win_count; otherwise, reset win_count to 1.
  3. The key observation is the potential domination by a particularly large number, reducing the need for many comparisons once it has its first win, simplifying the process:
    • If k is exceedingly large but there exists one very large element in the array, after it moves to the front due to an initial victory, it will continue winning against all subsequent smaller numbers.
    • This cycle might only need to revisit comparisons when the element current_winner is minuscule relative to k. Still, since it shifts outer competitors (lower values) successively to the array's end, rare is the occasion for extended series of evaluations.
  4. Therefore, an optimal approach utilizes direct pairwise comparisons without explicit full array rotations, and the algorithm significantly abbreviates when current_winner consecutively defeats k-1 challengers.

In essence, the approach utilizes a queue-like behavior without actual queue operations by manipulating array indices and element monitoring, ensuring efficiency even as input constraints extend to larger sizes and values.

Solutions

  • C++
  • Java
  • Python
cpp
class Solution {
public:
    int determineWinner(vector<int>& nums, int k) {
        int highest = nums[0];
        for (int i = 1; i < nums.size(); i++) {
            highest = max(highest, nums[i]);
        }
        
        int current = nums[0];
        int consecutiveWins = 0;
        
        for (int i = 1; i < nums.size(); i++) {
            int nextCompetitor = nums[i];
            
            if (current > nextCompetitor) {
                consecutiveWins++;
            } else {
                current = nextCompetitor;
                consecutiveWins = 1;
            }
            
            if (consecutiveWins == k || current == highest) {
                return current;
            }
        }
        
        return -1;
    }
};

The problem "Find the Winner of an Array Game" is solved in C++ using a straightforward approach that hinges on iterating through the number list and maintaining track of the maximum number. Here's a breakdown of the solution:

  • Start by determining the highest number in the array, as this number has the potential to end the competition early if it reaches the required consecutive wins.
  • Initialize the game with the first number in the array and set its initial consecutive wins to zero.
  • Loop through each element in the array starting from the second element, treating it as the next competitor.
  • Compare the current number with the next competitor:
    • If the current number is greater, increment the count of its consecutive wins.
    • If the next competitor is greater, switch the current number to this competitor and reset consecutive wins to one.
  • Check after each comparison:
    • If a number's consecutive wins equal the specified threshold k, or if the current number equals the highest number in the array, return this number as it has won the game.
  • If the loop terminates without finding a winner that meets the criteria, return -1.

This implements a strategy that models the game's rules effectively, ensuring that it efficiently determines the winner by exploiting the given constraints and conditions with proper handling of potential early termination scenarios. By utilizing standard C++ vector operations and control structures, the given implementation offers a clear and direct method to resolve the problem.

java
class Solution {
    public int determineWinner(int[] nums, int k) {
        int highestValue = nums[0];
        for (int i = 1; i < nums.length; i++) {
            highestValue = Math.max(highestValue, nums[i]);
        }
        
        int currentWinner = nums[0];
        int consecutiveWins = 0;
        
        for (int i = 1; i < nums.length; i++) {
            int challenger = nums[i];
            
            if (currentWinner > challenger) {
                consecutiveWins++;
            } else {
                currentWinner = challenger;
                consecutiveWins = 1;
            }
            
            if (consecutiveWins == k || currentWinner == highestValue) {
                return currentWinner;
            }
        }
        
        return -1;
    }
}

In the provided Java program, the task is to determine the winner of an array game. The winner is decided based on the number of consecutive wins required (k) or if any player becomes the dominant player by winning against the highest value in the array.

Here's how the provided code achieves this:

  • Initialize Variables:

    • highestValue starts as the first element of the array nums, and iteratively updates to maintain the maximum value found in the array.
    • currentWinner starts as the first element, representing the current winner in the game loop.
    • consecutiveWins, initialized to 0, tracks the number of consecutive wins the currentWinner has.
  • Determine the Maximum Value:

    • Loop through each element in the array nums to find the maximum value highestValue. This step is crucial to identify a short-circuit condition where the current winner has already won against the highest possible value.
  • Game Logic to Determine the Winner:

    • Iterate through the array, starting from the second element, and compare each element (challenger) to the currentWinner.
    • If currentWinner is greater than the challenger, increment consecutiveWins. If not, update currentWinner to the challenger and reset consecutiveWins to 1.
    • The loop exits in two scenarios:
      • If consecutiveWins reaches k, indicating the currentWinner has won consecutively k times.
      • If currentWinner becomes equal to highestValue, indicating that the player has won against the highest value in the array.
  • Return Statement:

    • If neither of the above conditions is satisfied by the end of the loop, the function returns -1, indicating no winner based on the given conditions.
    • Otherwise, the function returns the currentWinner when one of the exit conditions is met during the loop.

The solution efficiently utilizes conditional checks and updates within loops to determine the game's winner based on the described rules, providing an optimal solution to the array game challenge.

python
class Solution:
    def determine_winner(self, arr: List[int], k: int) -> int:
        highest_value = max(arr)
        current_leader = arr[0]
        consecutive_wins = 0

        for index in range(1, len(arr)):
            rival = arr[index]
            if current_leader > rival:
                consecutive_wins += 1
            else:
                current_leader = rival
                consecutive_wins = 1
            
            if consecutive_wins == k or current_leader == highest_value:
                return current_leader

This solution for the problem "Find the Winner of an Array Game" is implemented in Python and focuses on identifying the winner based on the rules provided. The function determine_winner takes an array arr and an integer k, and determines the winner using the following steps:

  • Identify the highest_value in the array using Python's max() function.
  • Initialize a current_leader to the first element of the array and set consecutive_wins to 0.
  • Iterate through the array starting from the second element. For each element:
    • Compare it with the current_leader. If current_leader is higher, increment consecutive_wins.
    • If the rival (current element) is greater, update current_leader to this new value and reset consecutive_wins to 1.
  • If at any point consecutive_wins equals k or the current_leader matches the highest_value, return the current_leader as the winner.

This algorithm primarily revolves around tracking wins in sequence and checking if any player dominates as per the 'k' threshold or is already the highest value in the array. With these conditions met, the winner is immediately decided and returned.

Comments

No comments yet.