LeetCode 679 24點遊戲
阿新 • • 發佈:2020-08-22
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; } }