题目地址:
https://leetcode.com/problems/24-game/
给定四个整数,算
24
24
24点。
思路是DFS。每次挑两个数,然后从vector里删掉,分 6 6 6种情况将 a + b a+b a+b, a − b a-b a−b, b − a b-a b−a, a ∗ b a*b a∗b, a / b a/b a/b, b / a b/a b/a加入vector,然后递归求解规模减 1 1 1的问题。当vector长度为 1 1 1的时候check一下结果是不是 24 24 24。需要注意,一定要用double类型来做,并且判断一个double是否等于 0 0 0,需要看其是否小于一个很小的数。代码如下:
class Solution {
public:
const double eps = 1e-9;
bool judgePoint24(vector<int>& v) {
vector<double> a(v.begin(), v.end());
return dfs(a);
}
bool dfs(vector<double>& a) {
if (a.size() == 1) return abs(a[0] - 24) < eps;
for (int i = 0; i + 1 < a.size(); i++)
for (int j = i + 1; j < a.size(); j++) {
double x = a[i], y = a[j];
a.erase(a.begin() + j);
a.erase(a.begin() + i);
a.push_back(x + y);
if (dfs(a)) return true;
a.back() = x - y;
if (dfs(a)) return true;
a.back() = y - x;
if (dfs(a)) return true;
a.back() = x * y;
if (dfs(a)) return true;
a.pop_back();
if (abs(y) > eps) {
a.push_back(x / y);
if (dfs(a)) return true;
a.pop_back();
}
if (abs(x) > eps) {
a.push_back(y / x);
if (dfs(a)) return true;
a.pop_back();
}
a.insert(a.begin() + i, x);
a.insert(a.begin() + j, y);
}
return false;
}
};
设vector长度为 n n n,空间复杂度 O ( n ) O(n) O(n),时间复杂度设为 T ( n ) T(n) T(n),则满足递推式: T ( n ) = 6 T ( n − 1 ) T ( 0 ) = 1 T(n)=6T(n-1)\\T(0)=1 T(n)=6T(n−1)T(0)=1所以 T ( n ) = O ( 6 n ) T(n)=O(6^n) T(n)=O(6n)