LeetCode——24 点游戏
Posted Shaw_喆宇
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode——24 点游戏相关的知识,希望对你有一定的参考价值。
Q:你有 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 。
A:
回溯法
代码:
public boolean judgePoint24(int[] nums) {
ArrayList<Double> array = new ArrayList<>();
for (int n : nums) {
array.add((double) n);
}
return solve(array);
}
//从数组中选出两个数,把运算结果加到数组中
private boolean solve(ArrayList<Double> array) {
if (array.size() == 1) {//数组中只剩下一个数的时候判断结果
return Math.abs(array.get(0) - 24) < 1e-6;
}
//从numbers中取出两个数,把结果放入数组中
for (int i = 0; i < array.size(); i++) {
for (int j = 0; j < array.size(); j++) {
if (i != j) {
//取不同的两个数
ArrayList<Double> nums = new ArrayList<>();
for (int k = 0; k < array.size(); k++) {
if (k != i && k != j) {
//把剩下的数加入到新数组
nums.add(array.get(k));
}
}
//获取两个数运算的结果集
Set<Double> doubles = calculate(array.get(i), array.get(j));
for (Double a : doubles) {
//把两个数运算的结果,分别加入到新数组中
nums.add(a);
if (solve(nums)) {//找到一个结果,立即返回
return true;
}
nums.remove(nums.size() - 1);//恢复现场
}
}
}
}
return false;
}
private Set<Double> calculate(Double a, Double b) {
Set<Double> res = new HashSet<>();
res.add(a - b);
res.add(b - a);
res.add(a + b);
res.add(a * b);
if (a != 0) {
res.add(b / a);
}
if (b != 0) {
res.add(a / b);
}
return res;
}
以上是关于LeetCode——24 点游戏的主要内容,如果未能解决你的问题,请参考以下文章
Leetcode之深度优先搜索&回溯专题-679. 24 点游戏(24 Game)
LeetCode810. 黑板异或游戏/455. 分发饼干/剑指Offer 53 - I. 在排序数组中查找数字 I/53 - II. 0~n-1中缺失的数字/54. 二叉搜索树的第k大节点(代码片段