具体思路:
自己想的暴力逐个dfs,但是没考虑到抱团性;
只需要每次选两个结合,然后添加进去即可,感觉自己像个智障;
计算方面注意一个大坑,以前没有注意过,浮点数比较;
例如,对于8/(3-8/3)来说,浮点数字面会认为等于24,但是实际比较的时候并不是;
两个浮点数比较最好用eps=1e-6来进行比较;
即fabs(a-b)<eps
,比较a,b是否相等;
具体算法:
const double eps=1e-6;
class Solution {
public:
bool judgePoint24(vector<int>& cards) {
vector<double>vec;
for(auto& ele:cards){
vec.push_back(double(ele));
}
return dfs(vec);
}
bool dfs(vector<double>vec){
if(vec.size()==1&&fabs(vec[0]-target)<eps)
return true;
for(int i=0;i<vec.size();i++){
for(int j=0;j<vec.size();j++){
vector<double>next;
if(i!=j){
for(int k=0;k<vec.size();k++){
if(k!=i&&k!=j){
next.push_back(vec[k]);
}
}
double a=vec[i];
double b=vec[j];
next.push_back(a+b);
if(dfs(next))
return true;
next.pop_back();
next.push_back(a-b);
if(dfs(next))
return true;
next.pop_back();
next.push_back(a*b);
if(dfs(next))
return true;
next.pop_back();
if(fabs(b)<eps)
continue;
next.push_back(a/b);
if(dfs(next))
return true;
next.pop_back();
}
}
}
return false;
}
private:
double target=24.0;
};