图-搜索-dfs-739. 24点
2020-04-04 19:46:42
问题描述:
你有 4
张卡片, 每一张上面都有一个 1
到 9
的数字. 你需要判断是否能用运算符 *
, /
, +
, -
, (
, )
来计算得到 24
样例
样例 1:
输入:[1, 4, 8, 7] 输出:true 解释:8 * (7 - 4) * 1 = 24
样例 2:
输入:[1, 1, 1, 2] 输出:false 解释:无法得到24
样例 3:
输入:[3, 3, 8, 8] 输出:true 解释:8 / ( 3 - 8 / 3) = 24
注意事项
除法运算符 / 是真正的除法, 而不是整数除法. 所以 4 / (1 - 2 / 3) = 12.
所有的运算符位于两个数字之间. 尤其是, 我们不能将 - 当做一个一元运算符. 比如说, 输入为[1, 1, 1, 1], 表达式 - 1 - 1 - 1 - 1 是不允许的
你不能将数字 串联
起来. 比如, 如果输入为 [1, 2, 1, 2], 我们不能写成 12 + 12
问题求解:
直接暴力搜索。
public boolean compute24(double[] nums) { // write your code here return compute(nums, 4); } public boolean compute(double[] nums, int n) { if (n == 1) { if (Math.abs(nums[0] - 24) <= 1E-6) return true; else return false; } for(int i = 0; i < n; i ++) { for (int j = i + 1; j < n; j++) { double a, b; a = nums[i]; b = nums[j]; nums[j] = nums[n - 1]; nums[i] = a + b; if (compute(nums, n - 1)) { return true; } nums[i] = a - b; if (compute(nums, n - 1)) { return true; } nums[i] = b - a; if (compute(nums, n - 1)) { return true; } nums[i]=a * b; if (compute(nums, n - 1)) { return true; } if (b != 0){ nums[i] = a / b; if(compute(nums, n - 1)) { return true; } } if (a != 0){ nums[i] = b / a; if(compute(nums, n - 1)) { return true; } } nums[i] = a; nums[j] = b; } } return false; }