SubsetII

Given a collection of integers that might contain duplicates, S, return all possible subsets.

Note:

  • Elements in a subset must be in non-descending order.
  • The solution set must not contain duplicate subsets.

For example,
If S = [1,2,2], a solution is:

[
  [2],
  [1],
  [1,2,2],
  [2,2],
  [1,2],
  []
] 

public class Solution {
    public ArrayList<ArrayList<Integer>> subsetsWithDup(int[] num) {
		// Start typing your Java solution below
		// DO NOT write main() function
		ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
		res.add(new ArrayList<Integer>());
		Arrays.sort(num);
		int start = 0;
		for(int i = 0; i < num.length; i++){
			int size = res.size();
			for(int j = start; j < size; j++){
				ArrayList<Integer> sub = new ArrayList<Integer>(res.get(j));
				sub.add(num[i]);
				res.add(sub);
			}
			if(i < num.length - 1 && num[i + 1] == num[i])
				start = size;
			else
				start = 0;
		}
		return res;
	}
}

For [1, 2, 3], order:

[]

[1]

[2] [1, 2]

[3] [1, 3] [2, 3] [1, 2, 3]

For [1, 2, 2], order:

[]

[1]

[2] [1, 2]

(start = size) [2, 2] [1, 2, 2]

public class Solution {
    ArrayList<ArrayList<Integer>> ret;
	ArrayList<Integer> cur;
	public void DFS(int[] num, int n) {
		if (num.length == n) {
			ret.add(new ArrayList<Integer>(cur));
			return;
		}
		int count = 1;
		while (n + 1 < num.length && num[n] == num[n + 1]) {
			count++;
			n++;
		}
		for (int i = 0; i <= count; i++) {
			for (int j = 0; j < i; j++)
				cur.add(num[n]);
			DFS(num, n + 1);
			for (int j = 0; j < i; j++)
				cur.remove(cur.size() - 1);
		}
	}

	public ArrayList<ArrayList<Integer>> subsetsWithDup(int[] num) {
		// Start typing your Java solution below
		// DO NOT write main() function
		ret = new ArrayList<ArrayList<Integer>>();
		cur = new ArrayList<Integer>();
		Arrays.sort(num);
		DFS(num, 0);
		return ret;
	}
}
For [1, 2, 3], order: [[], [3], [2], [2, 3], [1], [1, 3], [1, 2], [1, 2, 3]]

你可能感兴趣的:(SubsetII)