石子游戏 IX
难度:
标签:
题目描述
代码结果
运行时间: 85 ms, 内存: 26.6 MB
/*
* 思路:
* 1. 计算stones数组中每个石子的价值对3的余数,统计余数为0, 1, 2的个数。
* 2. 根据不同余数个数的组合情况来判断谁会获胜。
* 3. Alice和Bob会采取最佳策略进行游戏。
*/
import java.util.Arrays;
public class StoneGame {
public boolean stoneGame(int[] stones) {
long count0 = Arrays.stream(stones).filter(stone -> stone % 3 == 0).count();
long count1 = Arrays.stream(stones).filter(stone -> stone % 3 == 1).count();
long count2 = Arrays.stream(stones).filter(stone -> stone % 3 == 2).count();
// 如果count0是偶数,则只要count1和count2均不为零,Alice就可以通过相互抵消来获胜
if (count0 % 2 == 0) {
return count1 > 0 && count2 > 0;
} else {
// 如果count0是奇数,则需要判断count1和count2之间是否存在一个足够大的差异
return Math.abs(count1 - count2) > 2;
}
}
}
解释
方法:
题解主要通过计算各个石子对3取模的结果,根据其频率来确定Alice是否能够获胜。首先,石子的值对3的余数被分为三类:0, 1, 2。用数组cnt来计数每个类别的石子数量。接下来,根据cnt[0](余数为0的石子数量)是否为偶数,分两种情况考虑:1. 如果cnt[0]是偶数,则分别检查:当选择余数为1的石子开始时,余数为2的石子数量至少要不少于余数为1的石子数量;当选择余数为2的石子开始时,余数为1的石子数量至少要不少于余数为2的石子数量。2. 如果cnt[0]是奇数,则分别检查:当选择余数为1的石子开始时,余数为1的石子数量至少要比余数为2的石子多2;当选择余数为2的石子开始时,余数为2的石子数量至少要比余数为1的石子多2。最后,根据以上条件返回Alice是否可能赢得游戏。
时间复杂度:
O(n)
空间复杂度:
O(1)
代码细节讲解
🦆
为什么在题解中将石子的值对3取模,并分成三类0, 1, 2来处理?这样的分类有什么特别的意义吗?
▷🦆
题解中提到,如果cnt[0](余数为0的石子数量)为偶数,Alice有赢的可能性。这里为什么会根据cnt[0]的奇偶性来分别处理?
▷🦆
在判断Alice是否能赢的逻辑中,为什么当cnt[0]为偶数时,需要检查`cnt[1] >= 1 and cnt[2] >= cnt[1]`这样的条件?
▷