你有 4 张写有 1 到 9 数字的牌。你需要判断是否能通过 *,/,+,-,(,) 的运算得到 24。
示例 1:
输入: [4, 1, 8, 7]
输出: True
解释: (8-4) * (7-1) = 24
示例 2:
输入: [1, 2, 1, 2]
输出: False
class Solution {
public boolean judgePoint24(int[] nums){
double[] doubles = Arrays.stream(nums).asDoubleStream().toArray();
return judgePoint24(doubles);
}
public boolean judgePoint24(double[] nums){
if(nums.length == 1){
return Math.abs(nums[0] - 24.0) <= 0.00001;
}
// 回溯法开始
// 两层for循环,任选两个数参加运算
for(int i = 0; i < nums.length - 1; i++){
for(int j = i + 1; j < nums.length; j++){
// 是否合法
boolean isValid = false;
double[] temp = new double[nums.length - 1];
// j代表复制的长度
// 复制待删除元素j的前部
System.arraycopy(nums, 0, temp, 0, j);
// 复制待删除元素j的后部
System.arraycopy(nums, j + 1, temp, j, temp.length - j);
// 上两行代码就是删除了j
// 加法
temp[i] = nums[i] + nums[j];
// 为什么是或呢
isValid = isValid || judgePoint24(temp);
// 减法(减与被减)
temp[i] = nums[i] - nums[j];
isValid = isValid || judgePoint24(temp);
temp[i] = nums[j] - nums[i];
isValid = isValid || judgePoint24(temp);
// 乘
temp[i] = nums[i] * nums[j];
isValid = isValid || judgePoint24(temp);
// 除(除与被除)
if(nums[j] != 0){
temp[i] = nums[i] / nums[j];
isValid = isValid || judgePoint24(temp);
}
if(nums[i] != 0){
temp[i] = nums[j] / nums[i];
isValid = isValid || judgePoint24(temp);
}
// 如果成功了就返回了,不再继续暴力枚举
if(isValid)
return true;
}
}
return false;
}
}