• 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;
        }
    }
    
  • 相关阅读:
    BZOJ 4010: [HNOI2015]菜肴制作( 贪心 )
    bzoj 1084
    bzoj 2763
    bzoj 1003
    bzoj 1858
    codevs 1296
    cf 438D
    vijos 1083
    codevs 3303
    bzoj 1296
  • 原文地址:https://www.cnblogs.com/flyingrun/p/13610516.html
Copyright © 2020-2023  润新知