Numbers can be regarded as product of its factors. For example,
Write a function that takes an integer n and return all possible combinations of its factors.
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]
]
vector<vector<int>> getFactors(int n) { // time: O(nlogn); space: O(logn)
vector<vector<int> > res;
vector<int> cur;
helper(res, cur, n, 2);
return res;
}
void helper(vector<vector<int> >& res, vector<int>& cur, int n, int start) {
if (n == 1) {
if (cur.size() > 1) res.push_back(cur);
} else {
for (int i = start; i <= n; ++i) {
if (n % i != 0) continue;
cur.push_back(i);
helper(res, cur, n / i, i);
cur.pop_back();
}
}
}
vector<vector<int>> getFactors(int n) { // time: O(sqrt(n) * log(sqrt(n))); space: O(log(sqrt(n)))
vector<vector<int> > res;
vector<int> cur;
helper(res, cur, n, 2);
return res;
}
void helper(vector<vector<int> >& res, vector<int>& cur, int n, int start) {
if (n == 1) {
if (cur.size() > 1) res.push_back(cur);
} else {
for (int i = start; i * i <= n; ++i) {
if (n % i != 0) continue;
cur.push_back(i);
cur.push_back(n / i);
res.push_back(cur);
cur.pop_back();
helper(res, cur, n / i, i);
cur.pop_back();
}
}
}