题目描述:
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.
Example 1:
Input: 1
Output: []
Example 2:
Input: 37
Output:[]
Example 3:
Input: 12
Output:
[
[2, 6],
[2, 2, 3],
[3, 4]
]
Example 4:
Input: 32
Output:
[
[2, 16],
[2, 2, 8],
[2, 2, 2, 4],
[2, 2, 2, 2, 2],
[2, 4, 4],
[4, 8]
]
class Solution {
public:
vector<vector<int>> getFactors(int n) {
vector<vector<int>> result;
get_factors_recur(n,2,{},result); // 上一个因数默认为2,之后的因数都要大于等于2
return result;
}
void get_factors_recur(int n, int pre_factor, vector<int> cur, vector<vector<int>>& result)
{ // 避免重复的方法在于使得因数递增,那么因数的组合只有一种排列方法,因此要保留上一个因数,那么下一个因数大于等于上一个
if(n==1)
{
if(cur.size()>0) result.push_back(cur);
return;
}
if(n<pre_factor) return;
if(cur.size()>0) // 当已经分出一个因数之后,可以把剩下商全部放入结果
{
cur.push_back(n);
result.push_back(cur);
cur.pop_back();
}
for(int i=pre_factor;i<=sqrt(n);i++)
{ // 遍历所有可能的因数,进行递归
if(n%i!=0) continue;
cur.push_back(i);
get_factors_recur(n/i,i,cur,result);
cur.pop_back();
}
}
};