1. 程式人生 > 實用技巧 >LeetCode 679 24點遊戲

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;
    }
}