679.24点游戏
你有 4 张写有 1 到 9 数字的牌。你需要判断是否能通过 *,/,+,-,(,) 的运算得到 24。
来源:LeetCode
地址:https://leetcode-cn.com/problems/24-game/
思想:
(1)第一次从列表中随意取出两个数,做四则运算后再放回列表,即从4个数变成3个数。
(2) 从剩下三个数中,任取两个数,做四则运算后放回,即从3个数变成2个数。
(3)将两个数进行四则运算,如果结果是24±1e-6,则表明找到24点,反之没找到
代码:
public boolean judgePoint24(int[] nums) {
if (nums == null || nums.length == 0) return false;
List<Double> digit = new LinkedList<>();
for (int i = 0; i < nums.length; i++) {
digit.add((double) nums[i]);
}
return dfs(digit);
}
double errMargin = 1e-6;//误差限
private boolean dfs(List<Double> digit){
if (digit.size() == 1){
return Math.abs(digit.get(0) - 24) < errMargin;
}
int n = digit.size();
for (int i = 0; i < n; i++) {
for (int j = 0; j < n-1; j++) {
LinkedList<Double> tmp = new LinkedList<>(digit);
double a = tmp.remove(i);
double b = tmp.remove(j);
// System.out.println("a= "+a+",b="+b);
if (a <= b) {//因为加法和乘法满足交换律,所以只需要求一次就可以了
tmp.addFirst(a+b);//+
if (dfs(tmp))
return true;
tmp.remove(0);
tmp.addFirst(a*b);//*
if (dfs(tmp))
return true;
tmp.remove(0);
}
if (b != 0) {
tmp.addFirst(a / b);// /
if (dfs(tmp))
return true;
tmp.remove(0);
}
tmp.addFirst(a-b);// -
if (dfs(tmp))
return true;
}
}
return false;
}