Here is the full solution:
function subsetsWithDup(nums)
sort(nums)
result := []
backtrack(nums, 0, [], result)
return result
function backtrack(nums, start, current, result)
add copy of current to result
for i from start to length of nums - 1
// Skip duplicates
if i > start and nums[i] = nums[i-1] then
continue
add nums[i] to current
backtrack(nums, i + 1, current, result)
remove last element from current
Time: for generating all subsets. Space: for recursion depth. The sorting takes but is dominated by subset generation.