专注于 JetBrains IDEA 全家桶,永久激活,教程
持续更新 PyCharm,IDEA,WebStorm,PhpStorm,DataGrip,RubyMine,CLion,AppCode 永久激活教程

Leetcode每日刷题(九)

题目:除数博弈

描述: 爱丽丝和鲍勃一起玩游戏,他们轮流行动。爱丽丝先手开局。

最初,黑板上有一个数字 85_1.png。在每个玩家的回合,玩家需要执行以下操作:

选出任一 85_2.png,满足85_3.png85_4.png
85_5.png 替换黑板上的数字 85_6.png
如果玩家无法执行这些操作,就会输掉游戏。

只有在爱丽丝在游戏中取得胜利时才返回85_7.png,否则返回 85_8.png。假设两个玩家都以最佳状态参与游戏。

示例:

输入:2
输出:true
解释:爱丽丝选择 1,鲍勃无法进行操作。

输入:3
输出:false
解释:爱丽丝选择 1,鲍勃也选择 1,然后爱丽丝无法进行操作。

解法一:递推

思路: 当先手处于 85_9.png 状态时, 当做出任意操作,必定使得后手处于 85_10.png 状态, 所以需要找到是否存在一个 85_11.png 是必败的状态,就直接执行使得当前数字变为 85_12.png ;否则,无论怎样操作,接下来出现的数字都会是先手必胜的,即后手必胜。

可以定义 85_13.png 表示 85_14.png 时,先手处于必胜状态85_15.png 或必败状态85_16.png,枚举 85_17.png85_18.png 中的因数85_19.png 看是否存在85_20.png 为先手必败状态即可

class Solution {
    public boolean divisorGame(int N) {
        boolean[] f = new boolean[N + 5];

        f[1] = false;
        f[2] = true;
        for (int i = 3; i <= N; ++i) {
            for (int j = 1; j < i; ++j) {
                if ((i % j) == 0 && !f[i - j]) {
                    f[i] = true;
                    break;
                }
            }
        }

        return f[N];
    }
}

复杂度分析:

  • 时间复杂度 85_21.png
  • 空间复杂度 85_22.png

解法二:找规律

思路:

1、 如果 85_23.png 为奇数, 约数必为奇数,所以下个数必为偶数。
2、 如果 85_24.png 为偶数,先手只需一直选1,可使得后手一直为奇数,即先手下次还为偶数,直到先手碰到 85_25.png 的情况,即必胜

综上所述: 85_26.png 为奇数, 先手必输; 85_27.png 为偶数, 先手必胜。

class Solution {
    public boolean divisorGame(int N) {
        return N % 2 == 0;
    }
}

复杂度分析:

  • 时间复杂度 85_28.png
  • 空间复杂度 85_29.png

文章永久链接:https://tech.souyunku.com/26446

未经允许不得转载:搜云库技术团队 » Leetcode每日刷题(九)

JetBrains 全家桶,激活、破解、教程

提供 JetBrains 全家桶激活码、注册码、破解补丁下载及详细激活教程,支持 IntelliJ IDEA、PyCharm、WebStorm 等工具的永久激活。无论是破解教程,还是最新激活码,均可免费获得,帮助开发者解决常见激活问题,确保轻松破解并快速使用 JetBrains 软件。获取免费的破解补丁和激活码,快速解决激活难题,全面覆盖 2024/2025 版本!

联系我们联系我们