# Subsets - 子集

## Question

Given a set of distinct integers, return all possible subsets.

Note
Elements in a subset must be in non-descending order.

The solution set must not contain duplicate subsets.

Example
If S = [1,2,3], a solution is:

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


## 題解

1. [1] -> [1, 2] -> [1, 2, 3]
2. [2] -> [2, 3]
3. [3]

### Python

class Solution:
# @param {integer[]} nums
# @return {integer[][]}
def subsets(self, nums):
if nums is None:
return []

result = []
nums.sort()
self.dfs(nums, 0, [], result)
return result

def dfs(self, nums, pos, list_temp, ret):
# append new object with []
ret.append([] + list_temp)

for i in xrange(pos, len(nums)):
list_temp.append(nums[i])
self.dfs(nums, i + 1, list_temp, ret)
list_temp.pop()


### C++

class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
vector<vector<int> > result;
if (nums.empty()) return result;

sort(nums.begin(), nums.end());
vector<int> list;
dfs(nums, 0, list, result);

return result;
}

private:
void dfs(vector<int>& nums, int pos, vector<int> &list,
vector<vector<int> > &ret) {

ret.push_back(list);

for (int i = pos; i < nums.size(); ++i) {
list.push_back(nums[i]);
dfs(nums, i + 1, list, ret);
list.pop_back();
}
}
};


### Java

public class Solution {
public List<List<Integer>> subsets(int[] nums) {
List<List<Integer>> result = new ArrayList<List<Integer>>();
List<Integer> list = new ArrayList<Integer>();
if (nums == null || nums.length == 0) {
return result;
}

Arrays.sort(nums);
dfs(nums, 0, list, result);

return result;
}

private void dfs(int[] nums, int pos, List<Integer> list,
List<List<Integer>> ret) {

for (int i = pos; i < nums.length; i++) {
dfs(nums, i + 1, list, ret);
list.remove(list.size() - 1);
}
}
}


### 源碼分析

Java 和 Python 的程式碼中在將臨時list 添加到最終結果時新生成了物件，(Python 使用[] +), 否則最終返回結果將隨著list 的變化而變化。

Notice: backTrack(num, i + 1, list, ret);中的『i + 1』不可誤寫為『pos + 1』，因為pos用於每次大的循環，i用於內循環，第一次寫subsets的時候在這坑了很久... :(