leetcode 1025. 除数博弈

121 阅读1分钟

[toc] leetcode 1025. 除数博弈

题目描述

  1. 除数博弈

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

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

选出任一 x,满足 0 < x < n 且 n % x == 0 。 用 n - x 替换黑板上的数字 n 。 如果玩家无法执行这些操作,就会输掉游戏。

只有在爱丽丝在游戏中取得胜利时才返回 true 。假设两个玩家都以最佳状态参与游戏。

示例 1:

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

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

提示:

1 <= n <= 1000

解题思路

法1

方法1:动态规划+规律

判断会输的情况n=1会输,那么n+1=2会赢,我们可以选择1,让对方拿到会输的数字

同理,如果n==3 那么你只能让对方拿到2,这时你就会输,那么n+1=4就会赢

n==5时你只能让对方拿到4,对方就会赢n+1=6你就能让对方拿到会输的值

同理7时会输,8时会赢,那么就看看除了1与本身之外有没有可以赢的值吧

9,可以取1,3取1时对方拿到8还是会输,3时对方拿到6你也会输

由此可知,如果n为奇数,那么你的因数只能是奇数,奇数-奇数=偶数对面就只需要取1,你就只能拿到奇数,返回给他偶数,如此循环,最后你得到的只能是1必定输掉比赛

得出结论

  • 奇数=>输
  • 偶数=>赢

这也是最优的方法

  • 时间复杂度(O(1))
  • 空间复杂度(O(1))

  1. 模拟

以所有因数分别作为一种选择模拟计算是否返回真,只要有一种方案通过就返回真否则返回假

执行结果

法1

func divisorGame(n int) bool {
return n%2==0
}

执行结果: 通过 显示详情 查看示例代码 添加备注

执行用时: 0 ms , 在所有 Go 提交中击败了 100.00% 的用户 内存消耗: 1.7 MB , 在所有 Go 提交中击败了 100.00% 的用户 通过测试用例: 40 / 40 炫耀一下:

本文由mdnice多平台发布