32. Predict the Winner
Optimal game pick from both ends
Input: [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.Input: [1, 5, 233, 7]
Output: True
Explanation: Player 1 first chooses 1. Then player 2 have 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.Solution: (Recursion)
class Solution
{
public:
bool calcScore(vector<int> &nums, int s, int e, int c1, int c2, bool turn)
{
if (s > e)
{
return c1 >= c2;
}
if (turn)
{
return (calcScore(nums, s + 1, e, c1 + nums[s], c2, false) || calcScore(nums, s, e - 1, c1 + nums[e], c2, false));
}
else
{
return (calcScore(nums, s + 1, e, c1, c2 + nums[s], true) && calcScore(nums, s, e - 1, c1, c2 + nums[e], true));
}
}
bool PredictTheWinner(vector<int> &nums)
{
return calcScore(nums, 0, nums.size() - 1, 0, 0, true);
}
};Solution: (DP)
Solution: (DP) (finding value of both players)
Last updated