Every day a leetcode
题目来源:292. Nim 游戏
解法1:数学推理
让我们考虑一些小例子。
显而易见的是,如果石头堆中只有一块、两块、或是三块石头,那么在你的回合,你就可以把全部石子拿走,从而在游戏中取胜;
如果堆中恰好有四块石头,你就会失败。因为在这种情况下不管你取走多少石头,总会为你的对手留下几块,他可以将剩余的石头全部取完,从而他可以在游戏中打败你。因此,要想获胜,在你的回合中,必须避免石头堆中的石子数为4的情况。
假设当前堆里只剩下五块、六块、或是七块石头,你可以控制自己拿取的石头数,总是恰好给你的对手留下四块石头,使他输掉这场比赛。但是如果石头堆里有八块石头,你就不可避免地会输掉,因为不管你从一堆石头中挑出一块、两块还是三块,你的对手都可以选择三块、两块或一块,以确保在再一次轮到你的时候,你会面对四块石头。
于是我们发现,该问题可以拆分成许多小问题(每个小问题有四块石头)。
设石头数量为n,当n是4的倍数时,我们总是会输;否则我们会赢。
代码:
/*
* @lc app=leetcode.cn id=292 lang=cpp
*
* [292] Nim 游戏
*/
// @lc code=start
class Solution
{
public:
bool canWinNim(int n)
{
return n % 4;
}
};
// @lc code=end
结果:
复杂度分析:
时间复杂度:O(1)。
空间复杂度:O(1)。