很典型的dfs题,有几个地方容易出错:
- 下一次搜索可以从当前数字开始,但不能比当前数字更小:12 [2,2,3] works, 没说后面的必须比前面的大,这点就是startNum参数的用处以及为什么
dfsHelper(res, list, n, product*i, i);
这句code中紧接着搜索的数字是i
而不是i+1
- Factor的基本概念,哪些数才能有资格加进去?肯定是必须能整除n的数,不雅瞎加。
剩下的就是很典型的dfs+backtracking了。
class Solution {
public List<List<Integer>> getFactors(int n) {
List<List<Integer>> res = new ArrayList<>();
if (n == 1){
return res;
}
List<Integer> list = new ArrayList<>();
dfsHelper(res, list, n, 1, 2);
return res;
}
private void dfsHelper(List<List<Integer>> res, List<Integer> list, int n, int product, int startNum){
if (product == n){
res.add(new ArrayList<Integer>(list));
return;
}
if (product > n || startNum > n){
return;
}
for (int i = startNum; i < n; i++){
if (i*product > n){
return;
}
if (n % i == 0){
list.add(i);
dfsHelper(res, list, n, product*i, i);
list.remove(list.size() - 1);
}
}
}
}