2020.7.24 力扣每日

Posted -tty

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2020.7.24 力扣每日相关的知识,希望对你有一定的参考价值。

技术图片

 

 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 力扣每日的主要内容,如果未能解决你的问题,请参考以下文章

[6]力扣每日一题

[7]力扣每日一题

[7]力扣每日一题

力扣 每日一题 811. 子域名访问计数难度:中等

力扣 每日一题 934. 最短的桥难度:中等,rating: 1825(dfs / bfs)

力扣每日一题:993. 二叉树的堂兄弟节点(简单)