• 1025. 除数博弈


    题目

    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

    拓展学习

  • 相关阅读:
    开发趋势
    常用的meta
    meta基础
    HTTP请求方法GET和POST
    same-origin policy----wikipedia
    跨域——同源策略(译)
    DNS问答
    TCP/IP的整理
    鉴权方法
    Web攻击技术---OWASP top
  • 原文地址:https://www.cnblogs.com/BoysCryToo/p/13370488.html
Copyright © 2020-2023  润新知