classSolution{ publicbooleanPredictTheWinner(int[] nums){ if (nums == null) returnfalse; int left = 0, right = nums.length - 1; int ans = isWin(nums, left, right); return ans >= 0; }
privateintisWin(int[] nums, int left, int right){ if (left == right) { return nums[left]; } // 选择左边 int leftAns = nums[left] - isWin(nums, left + 1, right); // 选择右边 int rightAns = nums[right] - isWin(nums, left, right - 1);
publicbooleanPredictTheWinner(int[] nums){ if (nums == null) returnfalse; int len = nums.length; flag = newint[len][len]; for (int i = 0; i < len; i++) { for (int j = 0; j < len; j++) { flag[i][j] = -1; } } int left = 0, right = len - 1; int ans = isWin(nums, left, right); return ans >= 0; }
privateintisWin(int[] nums, int left, int right){ if (flag[left][right] != -1) return flag[left][right]; if (left == right) { flag[left][right] = nums[left]; return flag[left][right]; } int leftAns = nums[left] - isWin(nums, left + 1, right); int rightAns = nums[right] - isWin(nums, left, right - 1); flag[left][right] = Math.max(leftAns, rightAns); return flag[left][right]; } }