【我也想刷穿 LeetCode啊】464. 我能赢吗

68 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第19天,点击查看活动详情

现在前端很多岗位面试需要有一定的算法基础,或者说经常刷算法的会优先考虑。

因此每天刷刷LeetCode非常有必要

在这之前我也刷过一些算法题,也希望以后也坚持刷,跟某掘友一样,我也想刷穿 LeetCode

一、题目描述

在 "100 game" 这个游戏中,两名玩家轮流选择从 1 到 10 的任意整数,累计整数和,先使得累计整数和 达到或超过  100 的玩家,即为胜者。

如果我们将游戏规则改为 “玩家 不能 重复使用整数” 呢?

例如,两个玩家可以轮流从公共整数池中抽取从 1 到 15 的整数(不放回),直到累计整数和 >= 100。

给定两个整数 maxChoosableInteger (整数池中可选择的最大数)和 desiredTotal(累计和),若先出手的玩家是否能稳赢则返回 true ,否则返回 false 。假设两位玩家游戏时都表现 最佳 。

 

示例 1:

输入:maxChoosableInteger = 10, desiredTotal = 11
输出:false
解释:
无论第一个玩家选择哪个整数,他都会失败。
第一个玩家可以选择从 1 到 10 的整数。
如果第一个玩家选择 1,那么第二个玩家只能选择从 2 到 10 的整数。
第二个玩家可以通过选择整数 10(那么累积和为 11 >= desiredTotal),从而取得胜利.
同样地,第一个玩家选择任意其他整数,第二个玩家都会赢。

来源:力扣(LeetCode) 链接:leetcode.cn/problems/ca… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、思路分析

记 M = maxChoosableInteger, 玩家在剩余可选的范围内选择,最终选择的路径有 M!条,有些重复,可以剪枝,输赢只有选择的状态有关,与路径无关。在某时某刻,可选的数字与已选的数字组合为一种状态,此状态用二进制表示,如000111可表示1,2,3已用,4, 5,6未选, 用十进制表示为3.其对应一种“输赢状态”, 所以dp存储所有可能选择状态下输赢的情况,可能选择的状态state有 2 ^ maxChoosableInteger 种, dp[state]表示当前状态下先手是否必赢

let tem = (1 << (i - 1)) 表示当前所选数字,(state & tmp) === 0 代表 i 还未使用,可以使用 i

if((d - i <= 0) || !recursive(state | tmp, d - i)) 代表两种当前选手当前选择可以赢的情况,一种是 d - i <= 0; 一种是选择后对手必输 !recursive(state | tmp, d - i)

三、代码实现

/**
 * @param {number} maxChoosableInteger
 * @param {number} desiredTotal
 * @return {boolean}
 */
var canIWin = function(maxChoosableInteger, desiredTotal) {

	if(maxChoosableInteger >= desiredTotal) return true
	if((1 + maxChoosableInteger) * maxChoosableInteger < desiredTotal * 2) return false

	let dp = new Array((1 << maxChoosableInteger) - 1)
	const recursive = (state, d) => {
		if(dp[state]) return dp[state]
		for(let i = 1; i <= maxChoosableInteger; i++) {
			let tmp = (1 << (i - 1))
			if((state & tmp) === 0) {
				if((d - i <= 0) || !recursive(state | tmp, d - i)) {
					dp[state] = true
					return true
				}
			}
		}
		dp[state] = false
		return false
	}

	return recursive(0, desiredTotal)
};


四、总结

以上就是本道题的所有内容了,本系列会持续更,欢迎点赞、关注、收藏,另外如有其他的问题,欢迎下方留言给我,我会第一时间回复你,感谢~