码迷,mamicode.com
首页 > 其他好文 > 详细

2020.7.24 力扣每日

时间:2020-07-24 23:43:32      阅读:80      评论:0      收藏:0      [点我收藏+]

标签:public   pre   使用   胜利   利用   color   game   基础   span   

技术图片

 

 1 class Solution {
 2     public boolean divisorGame(int N) {
 3         boolean[] dp = new boolean[N + 3];                        //初始化DP
 4         dp[1] = false;                                            //数字为1时失败
 5         dp[2] = true;                                             //数字为2时胜利
 6         for (int i = 3; i <= N; i++){                             //计算其余情况
 7             for (int j = 1; j < i; j++){                          //寻找其余值的最优解
 8                 if ((i % j == 0) && (!dp[i - j])){                
 9                     dp[i] = true;                                 //必定胜利跳出循环
10                     break;
11                 }
12             }
13         }
14         return dp[N];
15     }
16 }

解题思路:

   对于该题,第一反应是可以使用动态规划。利用dp数组存储所有数字情况的胜负情况。首先探寻dp数组的动态方程,我们观察题目。可以发现,对于任意一个数字i来说,我们都需寻找最优解j,来使自己胜利,显然j必须满足i%j == 0,并且因为是必须胜利的,那么表明,必定存在一个j,在我选择j后,对方回合的dp[i - j]是失败的。接着,考虑dp数组的初始化,根据例题,显然1时必定失败,2时必定成功。那么此刻思路就清晰了,我们利用变量i遍历[3,N],根据上述思路,即可判断N是否必胜。

注意点:

在寻找最优解j时,取值范围是[1,i),在满足(i % j == 0)的基础前提下, 只有满足了dp[i - j] == false,才说明当前数字i,我取j后必定胜利。

时间复杂度:O(N)

空间复杂度:O(1)

优化:

当然该题还有一个十分简单快捷的方法,我们可以观察样例发现一个规律,当N为奇数时,必定失败。当N为偶数时必定成功。即return N % 2 == 0即可。

2020.7.24 力扣每日

标签:public   pre   使用   胜利   利用   color   game   基础   span   

原文地址:https://www.cnblogs.com/-TTY/p/13375034.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!