leetcode 1025.除数博弈

原题

1025.除数博弈
2020年7月24日 每日一题
在这里插入图片描述

题解

方法一 数学判断

奇输偶赢。
本思路java代码示例:

//2020.05.13 17:41
//执行用时 :0 ms, 在所有 Java 提交中击败了100.00%的用户
//内存消耗 :36.7 MB, 在所有 Java 提交中击败了10.00%的用户
class Solution {
    public boolean divisorGame(int N) {
        return N%2==0;
    }
}
/*
数字N如果是奇数,它的约数必然都是奇数;若为偶数,则其约数可奇可偶。
无论N初始为多大的值,游戏最终只会进行到N=2时结束,那么谁轮到N=2时谁就会赢。
因为爱丽丝先手,N初始若为偶数,爱丽丝则只需一直选1,使鲍勃一直面临N为奇数的情况,这样爱丽丝稳赢;
N初始若为奇数,那么爱丽丝第一次选完之后N必为偶数,那么鲍勃只需一直选1就会稳赢。
综述,判断N是奇数还是偶数,即可得出最终结果!

作者:coder233
链接:https://leetcode-cn.com/problems/divisor-game/solution/qi-shi-shi-yi-dao-shu-xue-ti-by-coder233/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
*/

方法一参考资料

方法二 dp

根据观察,我么知道N=1 的时候假,N=2的时候假,那么我们从3开始只要能够找到,在N=n的时候,一个n-m(其中m为n的某个非n的约数,使得那时候必输即可(此时必输基于两者身份互换))情况下会输的时候,那么这一次就肯定会赢。
本方法java代码示例:

/*
@v7fgg
执行用时:6 ms, 在所有 Java 提交中击败了16.95%的用户
内存消耗:36.5 MB, 在所有 Java 提交中击败了10.00%的用户
2020年7月24日 8:17
*/
class Solution {
    public boolean divisorGame(int N) {
        if(N==1){return false;}
        if(N==2){return true;}
        boolean ans[]=new boolean[N+1];
        ans[0]=ans[2]=true;
        for(int i=3;i<=N;i++){
            for(int j=1;j<i-1;j++){
                if(i%j==0&&!ans[j-1]){
                    ans[i]=true;
                    break;
                }
            }
        }
        return ans[N];
    }
}

方法二参考资料1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

可爱抱抱呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值