题目描述
思路解析动画文字版
核心就一句话:能一步走到对手的「必输局」,我就赢。下面每一帧都在给一个石子数判 W 还是 L。
先定下出发点:剩 0 颗时轮到我,说明最后一颗已被对手拿走,我输了。所以 0 颗标 L(标红的就是它)。
现在判「剩 1 颗」是输是赢。我能拿 1 到 3 颗,于是能把局面甩给对手——剩 0 颗这几种。看这几格里有没有红色的 L。
三个去向里有红色的「0 颗」是 L,我只要拿走 1 颗,就把这个必输局留给对手,所以剩 1 颗时我能赢,标 W(绿)。
现在判「剩 2 颗」是输是赢。我能拿 1 到 3 颗,于是能把局面甩给对手——剩 1、0 颗这几种。看这几格里有没有红色的 L。
三个去向里有红色的「0 颗」是 L,我只要拿走 2 颗,就把这个必输局留给对手,所以剩 2 颗时我能赢,标 W(绿)。
现在判「剩 3 颗」是输是赢。我能拿 1 到 3 颗,于是能把局面甩给对手——剩 2、1、0 颗这几种。看这几格里有没有红色的 L。
三个去向里有红色的「0 颗」是 L,我只要拿走 3 颗,就把这个必输局留给对手,所以剩 3 颗时我能赢,标 W(绿)。
现在判「剩 4 颗」是输是赢。我能拿 1 到 3 颗,于是能把局面甩给对手——剩 3、2、1 颗这几种。看这几格里有没有红色的 L。
三个去向「3、2、1 颗」全是绿的 W,不管我拿几颗,对手接手都能赢,所以剩 4 颗我必输,标 L(红)。
现在判「剩 5 颗」是输是赢。我能拿 1 到 3 颗,于是能把局面甩给对手——剩 4、3、2 颗这几种。看这几格里有没有红色的 L。
三个去向里有红色的「4 颗」是 L,我只要拿走 1 颗,就把这个必输局留给对手,所以剩 5 颗时我能赢,标 W(绿)。
现在判「剩 6 颗」是输是赢。我能拿 1 到 3 颗,于是能把局面甩给对手——剩 5、4、3 颗这几种。看这几格里有没有红色的 L。
三个去向里有红色的「4 颗」是 L,我只要拿走 2 颗,就把这个必输局留给对手,所以剩 6 颗时我能赢,标 W(绿)。
现在判「剩 7 颗」是输是赢。我能拿 1 到 3 颗,于是能把局面甩给对手——剩 6、5、4 颗这几种。看这几格里有没有红色的 L。
三个去向里有红色的「4 颗」是 L,我只要拿走 3 颗,就把这个必输局留给对手,所以剩 7 颗时我能赢,标 W(绿)。
现在判「剩 8 颗」是输是赢。我能拿 1 到 3 颗,于是能把局面甩给对手——剩 7、6、5 颗这几种。看这几格里有没有红色的 L。
三个去向「7、6、5 颗」全是绿的 W,不管我拿几颗,对手接手都能赢,所以剩 8 颗我必输,标 L(红)。
现在判「剩 9 颗」是输是赢。我能拿 1 到 3 颗,于是能把局面甩给对手——剩 8、7、6 颗这几种。看这几格里有没有红色的 L。
三个去向里有红色的「8 颗」是 L,我只要拿走 1 颗,就把这个必输局留给对手,所以剩 9 颗时我能赢,标 W(绿)。
现在判「剩 10 颗」是输是赢。我能拿 1 到 3 颗,于是能把局面甩给对手——剩 9、8、7 颗这几种。看这几格里有没有红色的 L。
三个去向里有红色的「8 颗」是 L,我只要拿走 2 颗,就把这个必输局留给对手,所以剩 10 颗时我能赢,标 W(绿)。
现在判「剩 11 颗」是输是赢。我能拿 1 到 3 颗,于是能把局面甩给对手——剩 10、9、8 颗这几种。看这几格里有没有红色的 L。
三个去向里有红色的「8 颗」是 L,我只要拿走 3 颗,就把这个必输局留给对手,所以剩 11 颗时我能赢,标 W(绿)。
现在判「剩 12 颗」是输是赢。我能拿 1 到 3 颗,于是能把局面甩给对手——剩 11、10、9 颗这几种。看这几格里有没有红色的 L。
三个去向「11、10、9 颗」全是绿的 W,不管我拿几颗,对手接手都能赢,所以剩 12 颗我必输,标 L(红)。
全部推完,回头看红格:0、4、8、12——清一色 4 的倍数。所以结论是:n 是 4 的倍数就先手必输,否则必赢,一行判断 n % 4 != 0 就够了。
三个高频追问:0 为何是输、拿 1~m 颗的推广、以及怎么不打表直接想出 n%4。
参考代码
def canWinNim(n: int) -> bool: # n 是 4 的倍数 → 先手必输;否则必赢 return n % 4 != 0复杂度
- 时间:O(1),只做一次取余判断,和 n 多大无关
- 空间:O(1),不开数组、不递归,只用常数变量
易错点
面试追问把动画讲成自己的话
追问为什么 0 颗标成 L(输)而不是 W?
追问如果每次能拿 1 到 m 颗,规律怎么变?
追问能不能不打表、直接想出 n % 4?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
3 的幂
LeetCode 326 · 简单 · 沿着 数学套路 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题