LeetCode|5892. 石子游戏 IX

421 阅读2分钟
  • 题目描述

题目链接:leetcode-cn.com/problems/st… image.png

  • 思路分析

本题相当于是两个人轮流取数,如果取出的数字的总和为3的倍数则去最后一个数的人输,否则先手的人输,所以可以将每个数余三后计数再分类讨论:

1、对于余数0,若个数为偶数则对游戏不产生影响,这可以理解为只要一边取了0另一方也可以跟着取0,则结果没有区别。

2、若余数中1和2只存在一种。如果余数0的个数为偶,后手必胜;如果余数0的个数为奇,那只有该余数的个数大于3个时先手胜,否则后手胜。这里可以理解为当拿第三个非0数时,能够使得总和为三的倍数,则判该玩家负,如果0为偶数,那么先手的人必取到第三个非0数,0为奇数时则后手的人会取到,除此之外如果非零数的个数小于三则表示无法凑出三的倍数的总和,则后手胜。

3、余数1和2都存在且余数0个数为偶数,先手必胜。若只存在一个1或2,则先手玩家取该数,则后手必凑出3的倍数;存在多个时只要取少的那个数,后手也只能取这个数,之后先手玩家只能取多的数,后手玩家只能取少的数,否则就会使总和为3,直到少的数取完,后手负;一样多时同理,因为最开始会取两次少的数。

4、余数1和2都存在且余数0个数为奇数,由于结论1,所以以余数0的个数为1来讨论,因为该0的存在,所以先后手关系会在取0后反转,那先手只能取多的数,因为1和0在一轮中可以抵消掉,所以如果1和2的个数差小于3则最终结果无法凑出三的倍数,使得后手胜,所以只有在1和2的个数差大于等于3时先手胜,否则后手胜。

  • 代码

var stoneGameIX = function (stones) {
  let sum = [0,0,0];
  for(let num of stones) {
    sum[num%3]++;
  }
  if(sum[1] == 0 || sum[2] == 0) {
    return sum[1] + sum[2] >= 3 && sum[0] % 2 == 1;
  }
  if(sum[0] % 2 == 0) {
    return true;
  }
  if(Math.abs(sum[1] - sum[2]) >= 3) {
    return true;
  }
  return false;
};