应用「博弈论」分析「先手必胜态」序列具有何种性质|Java 刷题打卡

简介: 应用「博弈论」分析「先手必胜态」序列具有何种性质|Java 刷题打卡

题目描述



这是 LeetCode 上的 810. 黑板异或游戏 ,难度为 困难


Tag : 「博弈论」、「数学」、「异或」


黑板上写着一个非负整数数组 nums[i] 。


Alice 和 Bob 轮流从黑板上擦掉一个数字,Alice 先手。如果擦除一个数字后,剩余的所有数字按位异或运算得出的结果等于 0 的话,当前玩家游戏失败。 (另外,如果只剩一个数字,按位异或运算得到它本身;如果无数字剩余,按位异或运算结果为 0。)


换种说法就是,轮到某个玩家时,如果当前黑板上所有数字按位异或运算结果等于 0,这个玩家获胜。


假设两个玩家每步都使用最优解,当且仅当 Alice 获胜时返回 true。


示例:


输入: nums = [1, 1, 2]
输出: false
解释: 
Alice 有两个选择: 擦掉数字 1 或 2。
如果擦掉 1, 数组变成 [1, 2]。剩余数字按位异或得到 1 XOR 2 = 3。那么 Bob 可以擦掉任意数字,因为 Alice 会成为擦掉最后一个数字的人,她总是会输。
如果 Alice 擦掉 2,那么数组变成[1, 1]。剩余数字按位异或得到 1 XOR 1 = 0。Alice 仍然会输掉游戏。
复制代码


提示:


  • 1 <= N <= 1000
  • 0 <= nums[i] <= 2162^{16}216


基本分析



这是一道「博弈论」题。


如果没接触过博弈论,其实很难想到,特别是数据范围为 10310^3103,很具有迷惑性。


如果接触过博弈论,对于这种「判断先手后手的必胜必败」的题目,博弈论方向是一个优先考虑的方向。


根据题意,如果某位玩家在操作前所有数值异或和为 000,那么该玩家胜利。要我们判断给定序列时,先手是处于「必胜态」还是「必败态」,如果处于「必胜态」返回 True,否则返回 False


对于博弈论的题目,通常有两类的思考方式:


  1. 经验分析:见过类似的题目,猜一个性质,然后去证明该性质是否可推广。
  2. 状态分析:根据题目给定的规则是判断「胜利」还是「失败」来决定优先分析「必胜态」还是「必败态」时具有何种性质,然后证明性质是否可推广。


博弈论



对于本题,给定的是判断「胜利」的规则(在给定序列的情况下,如果所有数值异或和为 000 可立即判断胜利,其他情况无法立即判断胜负),那么我们应该优先判断何为「先手必胜态」,如果不好分析,才考虑分析后手的「必败态」。


接下来是分情况讨论:


1. 如果给定的序列异或和为 000,游戏开始时,先手直接获胜:


由此推导出性质一:给定序列 nums 的异或和为 000,先手处于「必胜态」,返回 True


2. 如果给定序列异或和不为 000,我们需要分析,先手获胜的话,序列会满足何种性质:


显然如果要先手获胜,则需要满足「先手去掉一个数,剩余数值异或和必然不为 000;同时后手去掉一个数后,剩余数值异或和必然为 000」。


换句话说,我们需要分析什么情况下「经过一次后手操作」后,序列会以上述情况 111 的状态,回到先手的局面


也就是反过来分析想要出现「后手必败态」,序列会有何种性质。


假设后手操作前的异或和为 SumSumSumSum≠0Sum \neq 0Sum=0),「后手必败态」意味着去掉任意数字后异或和为 000


同时根据「相同数值异或结果为 000」的特性,我们知道去掉某个数值,等价于在原有异或和的基础上异或上这个值。


则有:


Sum′=Sum⊕nums[i]=0Sum' = Sum ⊕ nums[i] = 0Sum=Sumnums[i]=0

由于是「后手必败态」,因此 iii 取任意一位,都满足上述式子。


则有:


Sum⊕nums[0]=...=Sum⊕nums[k]=...=Sum⊕nums[n−1]=0Sum ⊕ nums[0] = ... = Sum ⊕ nums[k] = ... = Sum ⊕ nums[n - 1] = 0Sumnums[0]=...=Sumnums[k]=...=Sumnums[n1]=0


同时根据「任意数值与 000 异或数值不变」的特性,我们将每一项进行异或:


(Sum⊕nums[0])⊕...⊕(Sum⊕nums[k])⊕...⊕(Sum⊕nums[n−1])=0(Sum ⊕ nums[0]) ⊕ ... ⊕ (Sum ⊕ nums[k]) ⊕ ... ⊕ (Sum ⊕ nums[n - 1]) = 0(Sumnums[0])...(Sumnums[k])...(Sumnums[n1])=0


根据交换律进行变换:


(Sum⊕Sum⊕...⊕Sum)⊕(nums[0]⊕...⊕nums[k]⊕...⊕nums[n−1])=0(Sum ⊕ Sum ⊕ ... ⊕ Sum) ⊕ (nums[0] ⊕ ... ⊕ nums[k] ⊕ ... ⊕ nums[n - 1]) = 0 (SumSum...Sum)(nums[0]...nums[k]...nums[n1])=0


再结合 SumSumSum 为原序列的异或和可得:


(Sum⊕Sum⊕...⊕Sum)⊕Sum=0,Sum≠0(Sum ⊕ Sum ⊕ ... ⊕ Sum) ⊕ Sum = 0 , Sum \neq 0(SumSum...Sum)Sum=0,Sum=0


至此,我们分析出当处于「后手必败态」时,去掉任意一个数值会满足上述式子。


根据「相同数值偶数次异或结果为 000」的特性,可推导出「后手必败态」会导致交回到先手的序列个数为偶数,由此推导后手操作前序列个数为奇数,后手操作前一个回合为偶数。


由此推导出性质二:只需要保证先手操作前序列个数为偶数时就会出现「后手必败态」,从而确保「先手必胜态」。


代码:


class Solution {
    public boolean xorGame(int[] nums) {
        int sum = 0;
        for (int i : nums) sum ^= i;
        return sum == 0 || nums.length % 2 == 0;
    }
}
复制代码


  • 时间复杂度:O(n)O(n)O(n)
  • 空间复杂度:O(1)O(1)O(1)


总结



事实上,在做题的时候,我也是采取「先假定奇偶性,再证明」的做法,因为这样比较快。


但「假定奇偶性」这一步是比较具有跳跃性的,这有点像我前面说到的「经验分析解法」,而本题解证明没有做任何的前置假定,单纯从「先手必胜态」和「后手必败态」进行推导,最终推导出「先手序列偶数必胜」的性质 ,更符合前面说到的「状态分析解法」。


两种做法殊途同归,在某些博弈论问题上,「经验分析解法」可以通过「归纳」&「反证」很好分析出来,但这要求选手本身具有一定的博弈论基础;而「状态分析解法」则对选手的题量要求低些,逻辑推理能力高些。


两种方法并无优劣之分,都是科学严谨的做法。


最后



这是我们「刷穿 LeetCode」系列文章的第 No.810 篇,系列开始于 2021/01/01,截止于起始日 LeetCode 上共有 1916 道题目,部分是有锁题,我们将先将所有不带锁的题目刷完。


在这个系列文章里面,除了讲解解题思路以外,还会尽可能给出最为简洁的代码。如果涉及通解还会相应的代码模板。


为了方便各位同学能够电脑上进行调试和提交代码,我建立了相关的仓库:github.com/SharingSour…


在仓库地址里,你可以看到系列文章的题解链接、系列文章的相应代码、LeetCode 原题链接和其他优选题解。

相关文章
|
1月前
|
存储 数据采集 搜索推荐
Java 大视界 -- Java 大数据在智慧文旅旅游景区游客情感分析与服务改进中的应用实践(226)
本篇文章探讨了 Java 大数据在智慧文旅景区中的创新应用,重点分析了如何通过数据采集、情感分析与可视化等技术,挖掘游客情感需求,进而优化景区服务。文章结合实际案例,展示了 Java 在数据处理与智能推荐等方面的强大能力,为文旅行业的智慧化升级提供了可行路径。
Java 大视界 -- Java 大数据在智慧文旅旅游景区游客情感分析与服务改进中的应用实践(226)
|
1月前
|
存储 监控 数据可视化
Java 大视界 -- 基于 Java 的大数据可视化在企业生产运营监控与决策支持中的应用(228)
本文探讨了基于 Java 的大数据可视化技术在企业生产运营监控与决策支持中的关键应用。面对数据爆炸、信息孤岛和实时性不足等挑战,Java 通过高效数据采集、清洗与可视化引擎,助力企业构建实时监控与智能决策系统,显著提升运营效率与竞争力。
|
1月前
|
Java 大数据 数据处理
Java 大视界 -- 基于 Java 的大数据实时数据处理在工业互联网设备协同制造中的应用与挑战(222)
本文探讨了基于 Java 的大数据实时数据处理在工业互联网设备协同制造中的应用与挑战。文章分析了传统制造模式的局限性,介绍了工业互联网带来的机遇,并结合实际案例展示了 Java 在多源数据采集、实时处理及设备协同优化中的关键技术应用。同时,也深入讨论了数据安全、技术架构等挑战及应对策略。
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
Java 大视界 -- Java 大数据机器学习模型在自然语言生成中的可控性研究与应用(229)
本文深入探讨Java大数据与机器学习在自然语言生成(NLG)中的可控性研究,分析当前生成模型面临的“失控”挑战,如数据噪声、标注偏差及黑盒模型信任问题,提出Java技术在数据清洗、异构框架融合与生态工具链中的关键作用。通过条件注入、强化学习与模型融合等策略,实现文本生成的精准控制,并结合网易新闻与蚂蚁集团的实战案例,展示Java在提升生成效率与合规性方面的卓越能力,为金融、法律等强监管领域提供技术参考。
|
1月前
|
存储 人工智能 算法
Java 大视界 -- Java 大数据在智能医疗影像数据压缩与传输优化中的技术应用(227)
本文探讨 Java 大数据在智能医疗影像压缩与传输中的关键技术应用,分析其如何解决医疗影像数据存储、传输与压缩三大难题,并结合实际案例展示技术落地效果。
|
1月前
|
机器学习/深度学习 安全 Java
Java 大视界 -- Java 大数据在智能金融反洗钱监测与交易异常分析中的应用(224)
本文探讨 Java 大数据在智能金融反洗钱监测与交易异常分析中的应用,介绍其在数据处理、机器学习建模、实战案例及安全隐私等方面的技术方案与挑战,展现 Java 在金融风控中的强大能力。
|
1月前
|
机器学习/深度学习 算法 Java
Java 大视界 -- Java 大数据机器学习模型在生物信息学基因功能预测中的优化与应用(223)
本文探讨了Java大数据与机器学习模型在生物信息学中基因功能预测的优化与应用。通过高效的数据处理能力和智能算法,提升基因功能预测的准确性与效率,助力医学与农业发展。
|
2月前
|
安全 算法 Java
Java 多线程:线程安全与同步控制的深度解析
本文介绍了 Java 多线程开发的关键技术,涵盖线程的创建与启动、线程安全问题及其解决方案,包括 synchronized 关键字、原子类和线程间通信机制。通过示例代码讲解了多线程编程中的常见问题与优化方法,帮助开发者提升程序性能与稳定性。
124 0
|
2月前
|
Java API 调度
从阻塞到畅通:Java虚拟线程开启并发新纪元
从阻塞到畅通:Java虚拟线程开启并发新纪元
282 83

热门文章

最新文章