leetcode[Nim Game]
来源:互联网 发布:ubuntu l2tp 编辑:程序博客网 时间:2024/05/29 09:15
一种可行解,但是遇到n很大时会造成内存溢出:
class Solution {/*public int help(int n, int turn){if(n <= 3){return turn + 1;}int A = help(n - 1, turn + 1);if(A % 2 != 0){return A;}int B = help(n - 2, turn + 1);if(B % 2 != 0){return B;}int C = help(n - 3, turn + 1);if(C % 2 != 0){return C;}return 0;} public boolean canWinNim(int n) {//问题性质类似于Ugly Number,有点动态规划的意思 //如何解决堆栈溢出?将重复的记录下来? int res = help(n, 0); if(res % 2 != 0){ return true; } else{ return false; } }*///思路来源,一步步分析k=1,2,3...的情况,发现规律(在没有思路时可以这样做)//借用存储结果,实际上是一个递推的做法(也算动态规划),用一个isWin[n]数组//在还剩下k个石头时,求出先手(就是我们要判断的先手的玩家)的isWin[k]为true还是false,一步步往上public boolean canWinNim(int n){//让下标从1开始if(n == 1 || n == 2 || n == 3) return true;//特殊情况单独处理,因为后面是基于大于3的情况boolean isWin[] = new boolean[n + 1];//求出先手(就是我们要判断的先手的玩家)的isWin[k]为true还是falsefor(int i = 1; i <= 3; i++) isWin[i] = true;for(int i = 4; i <= n; i++){//先手可以选1,2,3个石头,那么先手选了后,后手就变成先手,现在判断后手有没有可能赢//只要后手存在一种情况不可能赢时,先手就能赢if(isWin[i - 1] == false || isWin[i - 2] == false || isWin[i - 3] == false){isWin[i] = true;}else{isWin[i] = false;}}//数组构造完毕后就可以判断结果了return isWin[n] == true;}}
正确解法(也是利用了上面那种的思路,不过做了一个规律总结):
public class Solution {public boolean canWinNim(int n){if(n % 4 == 0)return false;elsereturn true;}}
阅读全文
0 0
- Nim Game leetcode 292
- leetcode Nim Game
- [LeetCode 292] Nim Game
- leetcode | Nim Game
- leetcode 292---NIM GAME
- [leetcode] 292.Nim Game
- LeetCode:Nim Game
- leetcode-292-Nim Game
- LeetCode-Nim Game
- *LeetCode-Nim Game
- LeetCode Nim Game
- LeetCode之Nim Game
- 【Leetcode】Nim Game
- LeetCode 292----Nim Game
- LeetCode:Nim Game
- LeetCode -- Nim Game
- LeetCode--Nim Game
- [Leetcode] Nim Game
- 1.React中文之Hello World
- 32-从1到n整数中X出现的次数
- 软件测试风险分析列表-待完善
- MyEclipse中复制项目或修改项目名字出现问题
- hdu 4570 Multi-bit Trie 【区间dp】
- leetcode[Nim Game]
- 23&24day 网络、cell的代码块,以及常见错误
- 域间路由的安全性增强机制-FRA(快速路由证明)
- VisionPro--- CogGraphicLabel
- iOS 从0到1搭建高可用App框架(二)
- Python中利用set去除列表(list)重复元素
- 融云SDK设置头像与消息监听注意事项
- Cadence学习总结
- HealthKit读取步数、运动距离、已爬楼层等信息