leetcode **679. 24 点游戏(待研究)

【题目】**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 。

【解题思路1】暴力法 回溯

我们设置各种运算操作(加减乘除)——(即,设置递归树的不同分支)
每次尝试一种运算——(选择进入一个分支)
把算的结果,放入数组继续递归——(递归计算当前子树(子问题))
当做到只剩一个数时——(到达递归树的底部),看看是不是24,是就返回true——(结束递归,并且控制不让进入别的分支)
否则返回false,告别错误的分支,进入别的递归分支,尝试别的运算。

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() == 0) {
    
    
            return false;
        }
        if (list.size() == 1) {
    
    
            return Math.abs(list.get(0) - TARGET) < EPSILON;
        }
        int size = list.size();
        for (int i = 0; i < size; i++) {
    
    
            for (int j = 0; j < size; j++) {
    
    
                if (i != j) {
    
    
                    List<Double> list2 = new ArrayList<Double>();
                    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;
    }
}

猜你喜欢

转载自blog.csdn.net/XunCiy/article/details/108164997
今日推荐