679. 24 点游戏
你有 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 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/24-game
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
import java.util.ArrayList;
import java.util.List;
class Solution {
static final int TARGET = 24;
static final double EPSILON = 1e-6;
static final int ADD = 0, MULTIPLY = 1, SUBTRACT = 2, DIVIDE = 3;
public boolean judgePoint24(int[] nums) {
List<Double> list = new ArrayList<Double>();
for (int num : nums) {
list.add((double) num);
}
return solve(list);
}
public boolean solve(List<Double> list) {
if (list.size() == 1) {
return Math.abs(list.get(0) - TARGET) < EPSILON;
}
if (list.size() == 0) {
return false;
}
for (int i = 0; i < list.size(); ++i) {
for (int j = 0; j < list.size(); ++j) {
if (i == j) {
continue;
}
List<Double> tmp = new ArrayList<>();
for (int k = 0; k < list.size(); ++k) {
if (k == i || k == j) {
continue;
}
tmp.add(list.get(k));
}
for (int k = 0; k < 4; ++k) {
if (k < 2 && j < i) {
continue;
}
List<Double> newList = new ArrayList<>(tmp);
if (k == ADD) {
newList.add(list.get(i) + list.get(j));
} else if (k == MULTIPLY) {
newList.add(list.get(i) * list.get(j));
} else if (k == SUBTRACT) {
newList.add(list.get(i) - list.get(j));
} else {
if (Math.abs(list.get(j)) > EPSILON) {
newList.add(list.get(i) / list.get(j));
}
}
if (solve(newList)) {
return true;
}
}
}
}
return false;
}
}
心之所向,素履以往 生如逆旅,一苇以航

浙公网安备 33010602011771号