解法一:数学

总共n堆(n为偶数)石子,下标从0到n-1,每次只能从头尾两堆中取,作为先手的Alex选择时,头尾两堆石头的下标为1奇1偶,无论他取哪一堆,轮到Lee选择时,新的头尾两堆的下标奇偶性相同,因此实质上,先手的选择结果可以决定后手选择奇数下标的石子堆还是偶数下标的石子堆
基于以上分析,先手就有了一个必胜的策略:分别统计下标为奇数的石子堆和下标为偶数的石子堆的总和,因为数据保证石子的总和为奇数,那么这两个和必然有大小之分,先手只需要一直取较大和对应下标的石子堆,迫使对手只能取另一组,就可以保证取得胜利。

  1. class Solution {
  2. public boolean stoneGame(int[] piles) {
  3. return true;
  4. }
  5. }

解法二:动态规划

参考官方题解

  1. class Solution {
  2. public boolean stoneGame(int[] piles) {
  3. int len = piles.length;
  4. int[][] dp = new int[len][len];
  5. for (int i = 0; i < len; ++i) {
  6. dp[i][i] = piles[i];
  7. }
  8. for (int i = len - 2; i >= 0; --i) {
  9. for (int j = i + 1; j < len; ++j) {
  10. dp[i][j] = Math.max(piles[i] - dp[i + 1][j], piles[j] - dp[i][j - 1]);
  11. }
  12. }
  13. return dp[0][len - 1] > 0;
  14. }
  15. }