题目:
Numbers can be regarded as product of its factors. For example,
8 = 2 x 2 x 2; = 2 x 4.
Write a function that takes an integer n and return all possible combinations of its factors.
Note:
- You may assume that n is always positive.
- Factors should be greater than 1 and less than n.
Examples:
input: 1
output:
[]input:
37
output:
[]input:
12
output:
[ [2, 6], [2, 2, 3], [3, 4] ]input:
32
output:
[ [2, 16], [2, 2, 8], [2, 2, 2, 4], [2, 2, 2, 2, 2], [2, 4, 4], [4, 8] ]
思路:
这也是一道特别好的Backtracking的训练题。我们每次从最小的一个因子开始到sqrt(n),查看之间的数是否可以被n整除,如果可以,那么有两个不同的选择:1)n除以这个因子,并保持这个因子,然后进行下一层搜索;2)不再进行下一层搜索,保存当前结果。在实践中我发现,临时结果采用引用要被非引用效率高不少。
代码:
class Solution {
public:
vector<vector<int>> getFactors(int n) {
vector<vector<int>> ret;
vector<int> line;
dfs(n, 2, ret, line);
return ret;
}
private:
void dfs(int n, int factor, vector<vector<int>> &ret, vector<int> &line) {
if (factor * factor > n) {
return;
}
dfs(n, factor + 1, ret, line);
if (n % factor == 0) {
line.push_back(factor);
line.push_back(n / factor); // stay in the same level
ret.push_back(line);
line.pop_back();
dfs(n / factor, factor, ret, line); // come to the next level
line.pop_back(); // pop up the factor
}
}
};