Skip to content

Instantly share code, notes, and snippets.

@Jimexist
Created September 7, 2013 07:46
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Jimexist/6473683 to your computer and use it in GitHub Desktop.
Save Jimexist/6473683 to your computer and use it in GitHub Desktop.
Subset with duplication
public class Solution {
public ArrayList<ArrayList<Integer>> subsetsWithDup(int[] num) {
Arrays.sort(num);
final ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
if (num.length == 0) {
result.add(new ArrayList<Integer>());
return result;
}
btrack(num, new boolean[num.length], 0, result);
return result;
}
private static void btrack(int[] num, boolean[] buffer, int k, ArrayList<ArrayList<Integer>> result) {
if (k == num.length) {
ArrayList<Integer> ai = new ArrayList<Integer>();
for (int i=0; i<buffer.length; ++i) {
if (buffer[i]) ai.add(num[i]);
}
result.add(ai);
} else {
int start = k;
int end = k+1;
buffer[start] = false;
while (end<buffer.length && num[end] == num[end-1]) {
buffer[end++] = false;
}
btrack(num, buffer, end, result);
for (; start < end; start++) {
buffer[start] = true;
btrack(num, buffer, end, result);
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment