leetcode
leetcode 951 ~ 1000
除数博弈

除数博弈

难度:

标签:

题目描述

代码结果

运行时间: 24 ms, 内存: 15.9 MB


/* 使用Java Stream的解法:
   使用流操作的思路虽然不是最优解,但是可以通过流的特性对问题进行分析。
   此处我们不需要实际使用流进行操作,因为判断奇偶性并不需要复杂的流操作。 */

public class Solution {
    public boolean divisorGame(int n) {
        // 使用流式思维进行分析,但实际操作上只是简单的判断
        return IntStream.range(1, n).anyMatch(x -> n % x == 0) && n % 2 == 0;
    }
}

解释

方法:

题解的核心思路基于数学归纳法,观察到一个简单的模式:当初始数字 n 是偶数时,爱丽丝会赢;当 n 是奇数时,爱丽丝会输。这是因为从偶数开始,爱丽丝可以通过选择 x = 1 使得鲍勃面对的数字变为奇数。奇数的任何除数(除了 1)也是奇数,因此鲍勃操作后的结果仍然是偶数,轮回到爱丽丝时她面对的又是偶数。这样爱丽丝可以保持在她的每个回合都将数字变为奇数,而鲍勃只能将数字变回偶数,直到数字减少到 2,爱丽丝赢得比赛。当 n 是奇数时,爱丽丝第一个操作会将其变为偶数,之后鲍勃可以应用相同的策略。

时间复杂度:

O(1)

空间复杂度:

O(1)

代码细节讲解

🦆
在解法中提到,从偶数开始爱丽丝可以通过选择 x = 1 使鲍勃面对的数字变为奇数,这里为什么总是选择 x = 1,选择其他 x 会有什么不同的结果?
在除数博弈中,选择 x = 1 是因为这是最简单且总是可行的选择,它能将偶数减少到最接近的奇数,使得鲍勃在接下来的回合面对的是奇数。选择除 1 以外的 x(必须是原数的因子且小于原数),如选择 x = 2 或更高的偶数因子,也会使结果变为一个较小的偶数,这样在下一个回合中爱丽丝仍然可以利用相同的策略。然而,选择 x = 1 更为直接且保守,因为它保持了游戏的简单性和策略的明确性。选择更大的 x 可能会导致游戏提前结束,但这通常不会改变最终的胜负结果,因为关键在于奇偶转换的控制。
🦆
这个解法依赖于n的奇偶性,是否有可能存在特殊情况或特定的 n 值,使得这种基于奇偶性的策略无效?
在除数博弈的规则下,没有特殊的 n 值使得基于奇偶性的策略无效。这种策略的有效性是由游戏的基本规则决定的,即玩家必须选择一个当前数字的因子作为 x,且这个因子必须小于当前数字。偶数与奇数的特性决定了其因子的奇偶性,从而影响了游戏的结果。无论 n 的具体值如何,只要它是偶数,爱丽丝总是可以通过选择 x = 1 来保持优势;如果是奇数,她将失去这一优势。因此,这种策略在所有 n 值上都是有效的。
🦆
解法提到当 n 是奇数时,爱丽丝第一个操作会将其变为偶数,这是否意味着爱丽丝总是选择 x = 1,如果是的话,这种选择是否总是最优的?
当 n 是奇数时,爱丽丝选择 x = 1 会将 n 变为偶数,这是因为从奇数减去 1 会得到偶数,从而尝试改变游戏的局面。选择 x = 1 是一种简单且直接的策略,因为它确保了数字的最大减少并快速改变数字的奇偶性。在这个游戏中,最优的策略通常是尽可能长时间地控制游戏的进程,而将数字维持在偶数是爱丽丝的最佳策略,因此在奇数的情况下选择 x = 1 是最优的,尽管它不保证爱丽丝能赢(如果 n 初始就是奇数)。

相关问题