你有 4 张写有 1 到 9 数字的牌。你需要判断是否能通过 *
,/
,+
,-
,(
,)
的运算得到 24。
示例 1:
输入: [4, 1, 8, 7] 输出: True 解释: (8-4) * (7-1) = 24
示例 2:
输入: [1, 2, 1, 2] 输出: False
注意:
- 除法运算符
/
表示实数除法,而不是整数除法。例如 4 / (1 - 2/3) = 12 。 - 每个运算符对两个数进行运算。特别是我们不能用
-
作为一元运算符。例如,[1, 1, 1, 1]
作为输入时,表达式-1 - 1 - 1 - 1
是不允许的。 - 你不能将数字连接在一起。例如,输入为
[1, 2, 1, 2]
时,不能写成 12 + 12 。
DFS
对于给定的四个数,不同的顺序的排列组合与加减乘除排列组合
需要注意的是 如果除数为0 不能进行除法
Code
def judgePoint24(self, nums: List[int]) -> bool:
@functools.lru_cache(None)
def dfs(array):
if len(array) == 1:
return abs(array[0] - 24) < 0.1
(a, b), array = array[:2], array[2:]
ops = (mul, add, sub) if b == 0 else (mul, add, sub, truediv)
return any(dfs(array[:i] + (op(a, b),) + array[i:])
for op in ops for i in range(len(array) + 1))
return any(dfs(item) for item in itertools.permutations(nums, 4))