给定一个长度为4的整数数组 cards 。你有 4 张卡片,每张卡片上都包含一个范围在 [1,9] 的数字。您应该使用运算符 ['+', '-', '*', '/'] 和括号 '(' 和 ')' 将这些卡片上的数字排列成数学表达式,以获得值24。
1 2 3
| 输入: cards = [4, 1, 8, 7] 输出: true 解释: (8-4) * (7-1) = 24
|
显而易见是回溯,但是由于题中给出除法是实数除法,所以必须使用double来进行计算
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| class Solution { static double Target = 24; static double standard = 1e-6; public boolean judgePoint24(int[] cards) { return backTrack(new double[]{cards[0],cards[1],cards[2],cards[3]}); } boolean backTrack(double[] nums){ if(nums.length ==1 )return Math.abs(nums[0]-Target)<standard; for(int i =0;i<nums.length;i++){ for(int j = i+1;j<nums.length;j++){ double[] next = new double[nums.length-1]; for(int k=0,index=0;index<nums.length;index++){ if(index!=i&&index!=j) next[k++] = nums[index]; } for(double num:caculator(nums[i],nums[j])){ next[next.length-1] = num; if(backTrack(next)) return true; } } } return false; } ArrayList<Double> caculator(double a, double b){ ArrayList<Double> list = new ArrayList(); list.add(a*b); list.add(a+b); list.add(a-b); list.add(b-a); if(!(Math.abs(a)<standard)) list.add(b/a); if(!(Math.abs(b)<standard)) list.add(a/b); return list; } }
|