zoukankan      html  css  js  c++  java
  • 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;
        }
    }
    
  • 相关阅读:
    软件设计师-成绩查询
    spring data jpa
    Maven 项目中使用 logback
    spring boot 整合 Camunda
    Spring 中 bean 的生命周期?
    如何合理的使用工具提高效率?
    Java 中的日志
    HashMap 原理?jdk1.7 与 1.8区别
    内存泄漏与溢出
    v-on 绑定自定义事件
  • 原文地址:https://www.cnblogs.com/flyingrun/p/13610516.html
Copyright © 2011-2022 走看看