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;
    }
原文地址:https://www.cnblogs.com/xym4869/p/12743591.html