leetcode679:24 点游戏

你有 4 张写有 1 到 9 数字的牌。你需要判断是否能通过 *,/,+,-,(,) 的运算得到 24。

示例 1:

输入: [4, 1, 8, 7]
输出: True
解释: (8-4) * (7-1) = 24

示例 2:

输入: [1, 2, 1, 2]
输出: False

class Solution {
    public boolean judgePoint24(int[] nums){
        double[] doubles = Arrays.stream(nums).asDoubleStream().toArray();
        return judgePoint24(doubles);
    }

    public boolean judgePoint24(double[] nums){

        if(nums.length == 1){
            return Math.abs(nums[0] - 24.0) <= 0.00001;
        }

        // 回溯法开始
        // 两层for循环,任选两个数参加运算
        for(int i = 0; i < nums.length - 1; i++){
            for(int j = i + 1; j < nums.length; j++){

                // 是否合法
                boolean isValid = false;

                double[] temp = new double[nums.length - 1];
                // j代表复制的长度
                // 复制待删除元素j的前部
                System.arraycopy(nums, 0, temp, 0, j);
                // 复制待删除元素j的后部
                System.arraycopy(nums, j + 1, temp, j, temp.length - j);
                // 上两行代码就是删除了j

                // 加法
                temp[i] = nums[i] + nums[j];
                // 为什么是或呢
                isValid = isValid || judgePoint24(temp);

                // 减法(减与被减)
                temp[i] = nums[i] - nums[j];
                isValid = isValid || judgePoint24(temp);
                temp[i] = nums[j] - nums[i];
                isValid = isValid || judgePoint24(temp);

                // 乘
                temp[i] = nums[i] * nums[j];
                isValid = isValid || judgePoint24(temp);

                // 除(除与被除)
                if(nums[j] != 0){
                    temp[i] = nums[i] / nums[j];
                    isValid = isValid || judgePoint24(temp);
                }
                if(nums[i] != 0){
                    temp[i] = nums[j] / nums[i];
                    isValid = isValid || judgePoint24(temp);
                }
                // 如果成功了就返回了,不再继续暴力枚举
                if(isValid)
                    return true;
            }
        }
        return false;
    }
}
posted @ 2020-09-03 20:41  程序员曾奈斯  阅读(176)  评论(0)    收藏  举报