image.png

一般解法

可以参考
语雀内容
有几点值得注意:

  1. 如果玩家12总分相等,仍然是玩家1胜
  2. 在上述条件下,如果nums.length为偶数,结论同877题,玩家1必胜。
  3. 877使用的解法是通用的解法,可以解此题。

递归解法

递归要先理解特殊条件,再归纳出一般规律。例如此题,

  1. 当数组只剩一个元素时,玩家只能选择此元素(特殊场景)
  2. 当数组剩下两个元素时,玩家可以选择左边元素也可以选择右边元素,分别计算,得到最优选择。
  3. 当数组剩下n个元素(n>1),分别递归计算选择左右元素的结果,得到最优选择,并返回。(归纳到一般情况)

从以上分析可以得到如下代码:

  1. public boolean PredictTheWinner(int[] nums) {
  2. return leftOrRight(nums, 0, nums.length - 1) >= 0;
  3. }
  4. public int leftOrRight(int[] nums, int start, int end) {
  5. if (start == end) {
  6. return nums[start];
  7. }
  8. int left = nums[start] - leftOrRight(nums, start + 1, end);
  9. int right = nums[end] - leftOrRight(nums, start, end - 1);
  10. return Math.max(left, right);
  11. }