Question:
You are given an array that represents bills in certain currency (for example
1, 2, 5, 10
) and an amount, for example17
. You should output the number of possible combinations of bills that sum to the given amount.
Answer:
{2, 5, 10}
Can I optimize/improve below code? Current complexity is: O(2(n-1)), where n
is the bill list length.
//Returns possible Bills List
public static List<Set<Integer>> possibleBills(Integer amount, int[] bills){
List<Set<Integer>> result = new ArrayList<Set<Integer>>();
if(amount < 0){
return null;
}
if(bills.length == 0){
return null;
}
if(amount-bills[0] == 0){
Set<Integer> set = new TreeSet<Integer>();
set.add(bills[0]);
result.add(set);
return result;
}
//Include 0'th bill and generate possible bills
List<Set<Integer>> result1 = possibleBills(amount - bills[0], Arrays.copyOfRange(bills, 1, bills.length));
if(result1 != null){
Iterator<Set<Integer>> result1Itr = result1.iterator();
while(result1Itr.hasNext()){
Set<Integer> set = result1Itr.next();
set.add(bills[0]);
}
result.addAll(result1);
}
//exclude 0'th bill and generate possible bills
List<Set<Integer>> result2 = possibleBills(amount, Arrays.copyOfRange(bills, 1, bills.length));
if(result2 != null){
result.addAll(result2);
}
if(result.size() == 0){
return null;
}
return result;
}