leetcode 292. Nim Game | 292. Nim 游戏(DP->数学推理)

leetcode 292. Nim Game | 292. Nim 游戏(DP->数学推理)题目 https leetcode cn com problems nim game 题解本题实际上是一个需要分析的数学题 如果第一时间没有发现规律的话 可以尝试先用递归法 暴力输出前几个 观察规律 用本函数跑 1 100 找规律 publicboolea intn if n lt 3 returntrue canWinNim n 1 canWinNim n 2 canWinNim n 3 只要有一个为 false 本轮就

题目

题解

本题实际上是一个需要分析的数学题。如果第一时间没有发现规律的话,可以尝试先用递归法,暴力输出前几个,观察规律。

// 用本函数跑 1~100,找规律 public boolean canWin(int n) { 
    if (n <= 3) return true; // canWinNim(n-1), canWinNim(n-2), canWinNim(n-3) 只要有一个为false本轮就能赢 // 也就是说,除非都为true才返回false,否则本轮能赢返回true return !(canWin(n - 1) && canWin(n - 2) && canWin(n - 3)); } 

输出结果如下。

这样,规律就显而易见了,即:每逢 4 的倍数返回 false,其余都返回 true。

为什么会出现这样的规律呢?实际上,是可以通过推理得到的:

面对4的整数倍的人,永远无法翻身,你拿N根对手就会拿4-N根,保证每回合共减4根,你永远对面4倍数,直到4。相反,如果最开始不是4倍数,你可以拿掉刚好剩下4倍数根,让他永远对面4倍数。

发现这个规律之后,本题就很简单了。代码如下:

class Solution { 
    public boolean canWinNim(int n) { 
    return n % 4 != 0; } } 

在这里插入图片描述


2021-11-16 二刷

题目

题解

DP空间超了,DP+空间优化时间超了,只能数学解法。。

class Solution { 
     public boolean canWinNim(int n) { 
     // Approach 1: Recursive, Brute Force // return process(n); // Approach 2: DP // if (n <= 3) return true; // boolean[] dp = new boolean[n + 1]; // dp[0] = false; // dp[1] = true; // dp[2] = true; // dp[3] = true; // for (int i = 4; i <= n; i++) { 
     // dp[i] = !dp[i - 1] || !dp[i - 2] || !dp[i - 3]; // } // return dp[n]; // Approach 3: DP + Space optimization // if (n <= 3) return true; // boolean[] dp = new boolean[4]; // dp[0] = false; // dp[1] = true; // dp[2] = true; // dp[3] = true; // int i = 3; // while (i++ <= n) { 
     // dp[i % 4] = !dp[(i + 4 - 1) % 4] || !dp[(i + 4 - 2) % 4] || !dp[(i + 4 - 3) % 4]; // } // return dp[n % 4]; // Approach 4: 玄学 // 对dp数组[false, true, true, ture]进行滚动更新,当除了自己以外其他3个均为true时结果为false,否则结果为true // 所以,滚动更新了个寂寞,根本不需要更新 return n % 4 != 0; } // 还剩n个石子的情况下,当前玩家以先手姿态是否能赢 // public boolean process(int n) { 
     // if (n <= 0) return false; // else if (n <= 3) return true; // // 只要有一种方法让对方不能赢,那么我就能赢 // return !process(n - 1) || !process(n - 2) || !process(n - 3); // } } 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/233123.html原文链接:https://javaforall.net

(0)
上一篇 2025年8月13日 下午7:01
下一篇 2025年8月13日 下午7:22


相关推荐

  • M3U8在线播放

    M3U8在线播放M3U8在线播放前言一、思路二、代码框架1.移动端适配2.改变M3U8地址3.设置videojs参数4.增加快进等功能写在最后前言当我们在网上愉快观影的时候,难免会遇到“M3U8格式”的视频。聪明的你应该也发现了,它是没办法直接播放的。它其实只是一个索引文件,根据它找到相应的.ts文件再进行播放。而这样做的好处,大概就是做多码率适配,保证视频播放的流畅性。有感兴趣的小伙伴可以参看这里—>M3U8文件格式。我今天要干的事情呢,就是解决当我们找到一个M3U8地址之后如何方便的播放它~一

    2022年6月15日
    139
  • DivMod 方法

    DivMod 方法br DivModbr 返回除法后的整数部分 和余数 br 单元 br Mathbr 语法 br procedureDiv Dividend Integer Divisor Word varResult Remainder Word br 描述 br 调用 DivMod 生成一个 16 位的除法 br Dividend 是被除数 br Divisor 是除数 br Result 是整数返回值 br Remainder 是余数返回值

    2026年3月18日
    2
  • ClientToScreen 和ScreenToClient 用法

    ClientToScreen 和ScreenToClient 用法ClientToScre 是把窗口坐标转换为屏幕坐标 ScreenToClie 是把屏幕坐标转换为窗口坐标屏幕坐标是相对于屏幕左上角的 而窗口坐标是相对于窗口用户区左上角的 VC 下 有些函数使用窗口坐标 有些使用屏幕坐标 使用时要分清 一个窗体分为两部分 系统区和客户区象标题和菜单之类的是系统区 由系统来控制 客户区就是你的地盘喽 Width He

    2026年3月19日
    2
  • 高斯函数和正态分布的关系_高斯函数半高宽

    高斯函数和正态分布的关系_高斯函数半高宽高斯函数与正态分布高斯函数或者说正态分布函数在很多场合都得到广泛应用,其是概率论和统计学的核心,在最大似然估计、贝叶斯估计中必不可少。其也是稀疏贝叶斯估计的重要基础。下面对高斯函数的一些基本知识点进

    2022年8月4日
    8
  • Tomcat下载安装并部署到IDEA的教程(附带idea两种热部署设置方法)

    这篇文章主要介绍了Tomcat下载安装并部署到IDEA的教程(附带idea两种热部署设置方法),本文图文并茂给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下

    2022年3月13日
    132
  • 常用数据库排名及分类介绍[通俗易懂]

    常用数据库排名及分类介绍[通俗易懂]DB-Engines:2019年6月全球数据库排行DB-Engines数据库流行度排行榜6月更新已发布,排名前二十如下:总体排名和上个月相比基本一致,其中排名前三的Oracle、MySQL和MicrosoftSQLServer也是分数增加最多的三个数据库,增加的分数分别为13.67、4.67和15.57,三者的总分也均已超过一千。一、数据库的分类…

    2022年5月7日
    52

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号