zoukankan      html  css  js  c++  java
  • LeetCode 679 24点游戏

    LeetCode 679 24点游戏

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

    执行用时:7 ms, 在所有 Java 提交中击败了40.63%的用户
    内存消耗:39.9 MB, 在所有 Java 提交中击败了19.15%的用户

    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>();
            /*数据都转换为double类型*/
            for (int num : nums) {
                list.add((double) num);
            }
            return solve(list);
        }
    
        public boolean solve(List<Double> list) {
            /*当list中只剩下1个数时即为本次遍历的结果*/
            if (list.size() == 1) {
                return Math.abs(list.get(0) - TARGET) < EPSILON;
            }
            int size = list.size();
            /*每次从list中按顺序取出两个数并选择其中一种运算,将得到的结果放回到list*/
            for (int i = 0; i < size; i++) {
                for (int j = 0; j < size; j++) {
                    if (i != j) {
                        List<Double> list2 = new ArrayList<Double>();
                        /*重新使用一个list用作下次遍历,防止与本次list的元素遍历冲突*/
                        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;
        }
    }
    
  • 相关阅读:
    MySQL数据库8(十九)外键
    MySQL数据库8(十八)用户权限管理
    HTML基本样式
    HTML5之部分新特性
    MySQL数据库8(十七)数据库的备份还原
    MySQL数据库8(十六)子查询
    MySQL数据库(十五)联合查询与连接查询
    MySQL数据库8(十四)聚合函数和运算符
    MySQL数据库8(十三)高级数据操作之select指令
    MySQL数据库8(十二)高级数据操作
  • 原文地址:https://www.cnblogs.com/CodeSPA/p/13546167.html
Copyright © 2011-2022 走看看