486. Predict the Winner
Description
You are given an integer array nums
. Two players are playing a game with this array: player 1 and player 2.
Player 1 and player 2 take turns, with player 1 starting first. Both players start the game with a score of 0
. At each turn, the player takes one of the numbers from either end of the array (i.e., nums[0]
or nums[nums.length - 1]
) which reduces the size of the array by 1
. The player adds the chosen number to their score. The game ends when there are no more elements in the array.
Return true
if Player 1 can win the game. If the scores of both players are equal, then player 1 is still the winner, and you should also return true
. You may assume that both players are playing optimally.
Example 1:
Input: nums = [1,5,2] Output: false Explanation: Initially, player 1 can choose between 1 and 2. If he chooses 2 (or 1), then player 2 can choose from 1 (or 2) and 5. If player 2 chooses 5, then player 1 will be left with 1 (or 2). So, final score of player 1 is 1 + 2 = 3, and player 2 is 5. Hence, player 1 will never be the winner and you need to return false.
Example 2:
Input: nums = [1,5,233,7] Output: true Explanation: Player 1 first chooses 1. Then player 2 has to choose between 5 and 7. No matter which number player 2 choose, player 1 can choose 233. Finally, player 1 has more score (234) than player 2 (12), so you need to return True representing player1 can win.
Constraints:
1 <= nums.length <= 20
0 <= nums[i] <= 107
Solutions
Solution 1: Memoization Search
We design a function \(\textit{dfs}(i, j)\), which represents the maximum difference in scores between the current player and the other player from the \(i\)-th number to the \(j\)-th number. The answer is \(\textit{dfs}(0, n - 1) \geq 0\).
The function \(\textit{dfs}(i, j)\) is calculated as follows:
- If \(i > j\), it means there are no numbers left, so the current player cannot take any points, and the difference is \(0\), i.e., \(\textit{dfs}(i, j) = 0\).
- Otherwise, the current player has two choices. If they choose the \(i\)-th number, the difference in scores between the current player and the other player is \(\textit{nums}[i] - \textit{dfs}(i + 1, j)\). If they choose the \(j\)-th number, the difference in scores between the current player and the other player is \(\textit{nums}[j] - \textit{dfs}(i, j - 1)\). The current player will choose the option with the larger difference, so \(\textit{dfs}(i, j) = \max(\textit{nums}[i] - \textit{dfs}(i + 1, j), \textit{nums}[j] - \textit{dfs}(i, j - 1))\).
Finally, we only need to check if \(\textit{dfs}(0, n - 1) \geq 0\).
To avoid repeated calculations, we can use memoization. We use an array \(f\) to record all the values of \(\textit{dfs}(i, j)\). When the function is called again, we can directly retrieve the answer from \(f\) without recalculating it.
The time complexity is \(O(n^2)\), and the space complexity is \(O(n^2)\). Here, \(n\) is the length of the array \(\textit{nums}\).
1 2 3 4 5 6 7 8 9 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
Solution 2: Dynamic Programming
We can also use dynamic programming. Define \(f[i][j]\) to represent the maximum score difference the current player can achieve in the range \(\textit{nums}[i..j]\). The final answer is \(f[0][n - 1] \geq 0\).
Initially, \(f[i][i] = \textit{nums}[i]\), because with only one number, the current player can only take that number, and the score difference is \(\textit{nums}[i]\).
Consider \(f[i][j]\) where \(i < j\), there are two cases:
- If the current player takes \(\textit{nums}[i]\), the remaining numbers are \(\textit{nums}[i + 1..j]\), and it is the other player's turn. So, \(f[i][j] = \textit{nums}[i] - f[i + 1][j]\).
- If the current player takes \(\textit{nums}[j]\), the remaining numbers are \(\textit{nums}[i..j - 1]\), and it is the other player's turn. So, \(f[i][j] = \textit{nums}[j] - f[i][j - 1]\).
Therefore, the state transition equation is \(f[i][j] = \max(\textit{nums}[i] - f[i + 1][j], \textit{nums}[j] - f[i][j - 1])\).
Finally, we only need to check if \(f[0][n - 1] \geq 0\).
The time complexity is \(O(n^2)\), and the space complexity is \(O(n^2)\). Here, \(n\) is the length of the array \(\textit{nums}\).
Similar problem:
1 2 3 4 5 6 7 8 9 10 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|