1025. 除数博弈 - 7月24日

题目

1025. 除数博弈

 

 

我的思路

两种方法:数学分析或者递推

我的实现

1.数学分析:
数字为2时选数字的必胜;数字3时选数字的必败;数字4时选数字的必胜;
以此类推,我发现可能存在奇数选数字的必败,反之必胜这样的情况,分析验证:
奇数的因子只可能是奇数,所以奇数时选数字的人选完后,下一个人拿到的一定是偶数;偶数时选数字的人只要选1或其他奇数因子,就一定留给对手奇数;最终得到1(奇数)的人输掉比赛,所以上面的猜测是成立的。
class Solution {
public:
    bool divisorGame(int N) {
        return N%2==0;
    }
};
时间复杂度和空间复杂度都是n
 
2.递推方法:
一个数组存储,选手在获得数组对应下标的数字时必败或者必胜,
若初始数字时n,那么遍历n所有的因子j,看是否存在(n-j)对应下标是否存在必败,若存在,则获得该数字的选手必胜,若不存在,则必败;
那么就用动态规划,初始知道win[1]=false,win[2]=true,依次递推
class Solution {
public:
    bool divisorGame(int N) {
        vector<bool> win;
        win.push_back(true);
        win.push_back(false);
        win.push_back(true);
        for(int i=3;i<=N;i++){
            win.push_back(false);
            for(int j =1;j<i;j++){
                if(i%j==0&&win[i-j]==false){
                    win[i]=true;
                }
            }
        }
        return win[N];
    }
};
时间复杂度n^2
空间复杂度n

拓展学习

posted on 2020-07-24 10:21  BoysCryToo  阅读(129)  评论(0编辑  收藏  举报

导航