题目链接

https://leetcode-cn.com/problems/24-game/

题目说明

题解

主要方法:递归 + 全排列

解释说明:

  1. 将 4 个数进行组合形成算式,发现除了 (a❈b)❈(c❈d) 的形式外,都可以通过单一的数字进行拆解,比如 (a*b+c)/d 可以逐步拆解成 (d -> (c -> (a -> (b))))。所以我们将特殊形式单独用全排列处理,一般情况用递归进行处理。

  2. 递归:

    入口(数字list,目标值target)

    下一步(取list中的一个值,将该值与target运算,算出list剩余的数应该得到怎样的值)

    出口(list只剩一个值,与target相等)

  3. 特殊处理: 对于 (a❈b)❈(c❈d) 的形式,将四个数字进行全排列后对每个可能的算式进行运算

代码示例:

class Solution:
def judgePoint24(self, nums: List[int]) -> bool:
#考虑精度误差,当结果与 24 的误差在 1e6 以内可以认为相等
EPSILON = 1e-6
def dfs(numbers, target):
if len(numbers) == 1:
return True if abs(numbers[0] - target) < EPSILON else False
for idx,num in enumerate(numbers):
tmp_nums = numbers[:]
tmp_nums.remove(num)
if dfs(tmp_nums, target - num) or dfs(tmp_nums, num - target) or (target and dfs(tmp_nums, num / target)) or (num and dfs(tmp_nums, target / num)):
return True
return False
if dfs(nums, 24):
return True # 将 (a b) (c d) 的特殊情况单独处理,其他情况都可以从一个数逐步拆解
for num_arrange in list(permutations(nums)):
if (num_arrange[0] + num_arrange[1]) * (num_arrange[2] + num_arrange[3]) == 24 \
or (num_arrange[0] + num_arrange[1]) * (num_arrange[2] - num_arrange[3]) == 24 \
or (num_arrange[0] - num_arrange[1]) * (num_arrange[2] + num_arrange[3]) == 24 \
or (num_arrange[0] - num_arrange[1]) * (num_arrange[2] - num_arrange[3]) == 24 \
or ((num_arrange[2] + num_arrange[3]) and (num_arrange[0] + num_arrange[1]) / (num_arrange[2] + num_arrange[3]) == 24) \
or ((num_arrange[2] - num_arrange[3]) and (num_arrange[0] + num_arrange[1]) / (num_arrange[2] - num_arrange[3]) == 24) \
or ((num_arrange[2] + num_arrange[3]) and (num_arrange[0] - num_arrange[1]) / (num_arrange[2] + num_arrange[3]) == 24) \
or ((num_arrange[2] - num_arrange[3]) and (num_arrange[0] - num_arrange[1]) / (num_arrange[2] - num_arrange[3]) == 24):
return True
return False

大神的暴力美学

https://leetcode.com/problems/24-game/discuss/107675/Short-Python

def helper(nums):
print(nums)
if len(nums) == 1:
return math.isclose(nums[0], 24)
return any(helper((x,) + tuple(rest)) for a, b, *rest in permutations(nums) for x in
{a + b, a - b, a * b, b and a / b})
return helper(tuple(nums))

每日一题 LeetCode 679. 24点游戏 【递归】【全排列】的更多相关文章

  1. Java实现 LeetCode 679 24 点游戏(递归)

    679. 24 点游戏 你有 4 张写有 1 到 9 数字的牌.你需要判断是否能通过 *,/,+,-,(,) 的运算得到 24. 示例 1: 输入: [4, 1, 8, 7] 输出: True 解释: ...

  2. Leetcode 679.24点游戏

    24点游戏 你有 4 张写有 1 到 9 数字的牌.你需要判断是否能通过 *,/,+,-,(,) 的运算得到 24. 示例 1: 输入: [4, 1, 8, 7] 输出: True 解释: (8-4) ...

  3. Leetcode之深度优先搜索&回溯专题-679. 24 点游戏(24 Game)

    Leetcode之深度优先搜索&回溯专题-679. 24 点游戏(24 Game) 深度优先搜索的解题详细介绍,点击 你有 4 张写有 1 到 9 数字的牌.你需要判断是否能通过 *,/,+, ...

  4. [leetcode] 679. 24 Game (Hard)

    24点游戏,游戏规则就是利用().+.-. *. /,对四个数字任意运算,可以得出24点则为true. 排列组合问题,最多有A42*A32*A22*4*4*4,也就是12*6*2*4*4=9216种组 ...

  5. [LeetCode] 679. 24 Game(回溯法)

    传送门 Description You have 4 cards each containing a number from 1 to 9. You need to judge whether the ...

  6. 每日一题-——LeetCode(121)买卖股票的最佳时机

    题目描述: 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格.如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润.注意你不能在买入股票前卖出股票 ...

  7. 每日一题-——LeetCode(78)子集

    给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集).输入: nums = [1,2,3]输出:[ [3],  [1],  [2],  [1,2,3],  [1,3],  [2, ...

  8. 每日一题-——LeetCode(46)全排列

    题目描述: 给定一个没有重复数字的序列,返回其所有可能的全排列.输入: [1,2,3]输出:[ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ...

  9. 每日一题-——LeetCode(486) 预测赢家

    题目描述: 给定一个表示分数的非负整数数组. 玩家1从数组任意一端拿取一个分数,随后玩家2继续从剩余数组任意一端拿取分数,然后玩家1拿,…….每次一个玩家只能拿取一个分数,分数被拿取之后不再可取.直到 ...

随机推荐

  1. Jmeter4.0安装教程

    1. 检查安装环境 1.1 Jdk要求 JDK版本:1.6+ 1.2 检查是否安装JDK win  +  R  快捷键打开运行,输入cmd 打开面板,在面板中输入  java -version,出现如 ...

  2. 《闲扯Redis十一》Redis 有序集合对象底层实现

    一.前言 Redis 提供了5种数据类型:String(字符串).Hash(哈希).List(列表).Set(集合).Zset(有序集合),理解每种数据类型的特点对于redis的开发和运维非常重要. ...

  3. 剑指 Offer 56 - II. 数组中数字出现的次数 II

    题目描述 在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次.请找出那个只出现一次的数字. 示例1: 输入:nums = [3,4,3,3] 输出:4 示例2: 输入:nums = ...

  4. Python 3.8.1 各版本下载地址

    Version Operating System Description MD5 Sum File Size GPG Gzipped source tarball Source release   f ...

  5. Centos7安装后进不去,死活就要填licence,该怎么办?

    遇到这个问题不要麻爪,跟着我做: 1 回车 2 回车 c 回车 c 回车 然后就进入系统了. 要使它联网,点右上角的开关按钮,将PCI Ethernet选择为connect状态. 我的centos7是 ...

  6. HTTP走私

    干货 https://paper.seebug.org/1048/

  7. 修改mysql、sqlserver数据库默认用户,不允许为root、sa等

    1.mysql cmd进入dos命令,输入mysql -u root -P 1202 -h localhost -p敲回车输入密码 use mysql; 修改用户名root为其他用户 update u ...

  8. 老男孩教育python全栈第22期Day15笔记

    day15 今日内容大纲 昨日内容回顾作业讲解 装饰器:完美的呈现了开放封闭原则.装饰器的本质:闭包. def wraper(f): def inner(*args, **kwargs): " ...

  9. 【深入理解Linux内核架构】6.6 资源分配

    一段摘自<Linux设备驱动程序>的话: 每种外设都通过读写寄存器进行控制.大部分外设都有多个寄存器,不管是内存地址空间还是I/O地址空间,这些寄存器的访问地址都是连续的. 在硬件层,内存 ...

  10. 微信小程序入门到精通

    微信小程序账号与工具 在线文档:https://mp.weixin.qq.com/debug/wxadoc/dev/ 小程序开发者账号注册 微信公众平台:https://mp.weixin.qq.co ...