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] ]
Analysis:
Recursively build a combination, for a target value (named target), we starting from the smallest factor, which is the last factor used rather than 2. If we get a new factor, saying target = x*y, we should guarantee that x<=y; we then go to the next layer of recursion looking for all combinations with target value of y.
Solution:
public class Solution { public List<List<Integer>> getFactors(int n) { Deque<Integer> combination = new LinkedList<Integer>(); List<List<Integer>> resList = new LinkedList<List<Integer>>(); getFactorsRecur(n,n,2,combination,resList); return resList; } public void getFactorsRecur(int n, int target, int lastFactor, Deque<Integer> combination, List<List<Integer>> resList){ if (target<lastFactor){ return; } // add current combination into resList. if (target<n){ List<Integer> temp = new ArrayList<Integer>(); temp.addAll(combination); temp.add(target); resList.add(temp); } // Further decompose the current target. for (int i=lastFactor;i*i<=target;i++){ if (target%i==0){ combination.addLast(i); getFactorsRecur(n,target/i,i,combination,resList); combination.removeLast(); } } } }