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:
Each combination's factors must be sorted ascending, for example: The factors of 2 and 6 is [2, 6], not [6, 2].
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]
]
Hide Company Tags LinkedIn
Hide Tags Backtracking
Hide Similar Problems (M) Combination Sum
根據題目的描述,我們需要的factor starts from 2 end before n itself. 同時新factor要大於等於之前的factor。
所以如果n<=2 return [];
對於大於2的n,首先想到了backtracking 產生所有可能的combinations, 但是很慢188ms
void helper(vector<vector<int>>& res, vector<int>& comb, int pos, int n){
if(n<=1){
if(comb.size() > 1){
sort(comb.begin(), comb.end());
res.push_back(comb);
}
return;
}
for(int i = pos; i<= n; ++i){
if(!(n%i)){
comb.push_back(i);
helper(res, comb, i, n/i);
comb.pop_back();
}
}
}
vector<vector<int>> getFactors(int n) {
vector<vector<int>> res;
vector<int> comb;
if(n == 1) return res;
helper(res, comb, 2, n);
return res;
}
另一種0ms的解法,終止條件是 i<=sqrt(n), 因爲當i大於這個條件的時候,下一個factor必定小於當前的factor。 所以code如下:
class Solution {
public:
void helper(vector<vector<int>>& res, vector<int>& comb, int fac, int n){
for(int i = fac; i<=sqrt(n); ++i){
if(!(n%i)){
vector<int> tmp = comb;
tmp.push_back(i);//push current factor
helper(res, tmp, i, n/i);//find all other factor smaller than sqrt(n/i);
tmp.push_back(n/i);//add n/i(the largest factor under current combination.
res.push_back(tmp);
}
}
}
vector<vector<int>> getFactors(int n){
vector<vector<int>> res;
vector<int> comb;
helper(res, comb, 2, n);
return res;
}
};