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]
]
思路:枚举DFS,从n 往下算,是比较合理的,计算会少很多,因为你往上做乘法,很多会超越边界;
class Solution {
public List<List<Integer>> getFactors(int n) {
List<List<Integer>> lists = new ArrayList<List<Integer>>();
if(n == 1) {
return lists;
}
List<Integer> list = new ArrayList<>();
dfs(lists, list, n, 2);
return lists;
}
private void dfs(List<List<Integer>> lists, List<Integer> list, int n, int index) {
if(n == 1) {
if(list.size() > 1) {
lists.add(new ArrayList<Integer>(list));
return;
}
}
for(int i = index; i <= n; i++) {
if(n % i == 0) {
list.add(i);
dfs(lists, list, n / i, i);
list.remove(list.size() - 1);
}
}
}
}