public void visit(int i, int end){
    	if(i == num.length){
    		ArrayList<Integer> ans = new ArrayList<Integer>(end);
    		for(int l = 0; l < end; l++) ans.add(temp[l]);
    		res.add(ans);
    		return;
    	}
    	int j = i + 1;
    	while(j < num.length && num[j] == num[i]) j++;
    	if(j == i + 1){ // no duplicate
    		visit(i + 1, end);
    		temp[end] = num[i];
    		visit(i + 1, end + 1);
    	} else { // duplicates
    		visit(j, end);
    		for(int l = 1; l <= j - i; l++){
    			temp[end + l - 1] = num[i];
    			visit(j, end + l);
    		}
    	}
    }