一般解法
可以参考
语雀内容
有几点值得注意:
- 如果玩家12总分相等,仍然是玩家1胜
- 在上述条件下,如果
nums.length
为偶数,结论同877题,玩家1必胜。 - 877使用的解法是通用的解法,可以解此题。
递归解法
递归要先理解特殊条件,再归纳出一般规律。例如此题,
- 当数组只剩一个元素时,玩家只能选择此元素(特殊场景)
- 当数组剩下两个元素时,玩家可以选择左边元素也可以选择右边元素,分别计算,得到最优选择。
- 当数组剩下n个元素(n>1),分别递归计算选择左右元素的结果,得到最优选择,并返回。(归纳到一般情况)
从以上分析可以得到如下代码:
public boolean PredictTheWinner(int[] nums) {
return leftOrRight(nums, 0, nums.length - 1) >= 0;
}
public int leftOrRight(int[] nums, int start, int end) {
if (start == end) {
return nums[start];
}
int left = nums[start] - leftOrRight(nums, start + 1, end);
int right = nums[end] - leftOrRight(nums, start, end - 1);
return Math.max(left, right);
}