LeetCode 679 24点游戏
LeetCode 679 24点游戏
题目描述:
你有 4 张写有 1 到 9 数字的牌。你需要判断是否能通过*,/,+,-,(,)
的运算得到 24。
执行用时:7 ms, 在所有 Java 提交中击败了40.63%的用户
内存消耗:39.9 MB, 在所有 Java 提交中击败了19.15%的用户
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>();
/*数据都转换为double类型*/
for (int num : nums) {
list.add((double) num);
}
return solve(list);
}
public boolean solve(List<Double> list) {
/*当list中只剩下1个数时即为本次遍历的结果*/
if (list.size() == 1) {
return Math.abs(list.get(0) - TARGET) < EPSILON;
}
int size = list.size();
/*每次从list中按顺序取出两个数并选择其中一种运算,将得到的结果放回到list*/
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
if (i != j) {
List<Double> list2 = new ArrayList<Double>();
/*重新使用一个list用作下次遍历,防止与本次list的元素遍历冲突*/
for (int k = 0; k < size; k++) {
if (k != i && k != j) {
list2.add(list.get(k));
}
}
for (int k = 0; k < 4; k++) {
if (k < 2 && i > j) {
continue;
}
if (k == ADD) {
list2.add(list.get(i) + list.get(j));
} else if (k == MULTIPLY) {
list2.add(list.get(i) * list.get(j));
} else if (k == SUBTRACT) {
list2.add(list.get(i) - list.get(j));
} else if (k == DIVIDE) {
if (Math.abs(list.get(j)) < EPSILON) {
continue;
} else {
list2.add(list.get(i) / list.get(j));
}
}
if (solve(list2)) {
return true;
}
/*回溯*/
list2.remove(list2.size() - 1);
}
}
}
}
return false;
}
}