题目
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