package com.interview.leetcode.backtracing;
import com.interview.utils.ConsoleWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* Created_By: stefanie
* Date: 14-11-23
* Time: 下午8:05
*/
public class Combination {
static class KCombination{
List<List<Integer>> sols;
public List<List<Integer>> combine(int[] num, int k) {
sols = new ArrayList<>();
Arrays.sort(num);
List<Integer> current = new ArrayList<Integer>();
combine(0, num, current, k);
return sols;
}
public void combine(int offset, int[] num, List<Integer> current, int k){
if(offset >= num.length) return;
current.add(num[offset]);
if(current.size() == k){
sols.add(new ArrayList<Integer>(current));
} else {
combine(offset + 1, num, current, k);
}
current.remove(current.size() - 1);
while(offset < num.length - 1 && num[offset + 1] == num[offset]) offset++; //de-dup
if(offset < num.length - 1) combine(offset + 1, num, current, k);
}
}
static class CombinationSum{
List<List<Integer>> sols;
public List<List<Integer>> combinationSum(int[] num, int K, boolean reuse){
sols = new ArrayList<>();
Arrays.sort(num);
List<Integer> current = new ArrayList<Integer>();
find(num, 0, current, 0, K, reuse);
return sols;
}
public void find(int[] num, int offset, List<Integer> current, int sum, int K, boolean reuse){
if(offset >= num.length || sum >= K) return;
current.add(num[offset]);
if(sum + num[offset] == K){
sols.add(new ArrayList<Integer>(current));
} else {
if(reuse) find(num, offset, current, sum + num[offset], K, reuse);
else find(num, offset + 1, current, sum + num[offset], K, reuse);
}
current.remove(current.size() - 1);
while(offset < num.length - 1 && num[offset + 1] == num[offset]) offset++; //de-dup
if(offset < num.length - 1) find(num, offset + 1, current, sum, K, reuse);
}
}
public static void main(String[] args){
KCombination combinator = new KCombination();
List<List<Integer>> combinations = combinator.combine(new int[]{1,2,3,4,4,5,5,6}, 5);
ConsoleWriter.print(combinations);
}
}