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