# 78-Subsets
###### tags: `Medium`
* Question:
https://leetcode.com/problems/subsets/
Key:
1.使用Backtracking / DFS / Recursive
2.bitwise operation
>reference :
1.
A.
https://medium.com/@ChYuan/leetcode-78-subsets-%E5%BF%83%E5%BE%97-medium-222577b31c81
B. https://leetcode.com/problems/subsets/discuss/458789/c%2B%2B-dfs
2. https://leetcode.com/problems/subsets/discuss/961493/C%2B%2B-Bitmask-Solution
Hint:
1. 這題的集合可能性可看作一種對高維度的窮舉,因此可以使用Backtracking處理
2. 每個位元都是選擇或不選擇兩種可能性,故有2^n次方種,另外也可以將選擇的數作為左子樹,不選的數作為右子數,因此也可以用DFS解,寫起來剛好跟Backtracking用於樹狀結構時相似
3. &1 == %2
4. >>1 == /2
* Backtracking跟DFS的相似與不同補充:
1. 很多人誤認 backtracking 就是圖論中的 DFS ,然而兩者沒有關係。兩者相似的地方是: backtracking 遇到不合理的解答會馬上回溯, DFS 遇到拜訪過的節點會馬上回溯。
2. https://stackoverflow.com/questions/1294720/whats-the-difference-between-backtracking-and-depth-first-search
>related problem :
## My Solution
```java=
class Solution {
public List<List<Integer>> subsets(int[] nums) {
List<List<Integer>> res = new ArrayList<List<Integer>>();
res.add(new ArrayList<Integer>());
for(int i = 0; i < nums.length; i++) {
List<Integer> list = new ArrayList<Integer>();
list.add(nums[i]);
dfs(res, list, nums, i + 1);
}
return res;
}
private void dfs(List<List<Integer>>res, List<Integer> list, int[] nums, int start) {
res.add(list);
if(start >= nums.length) {
return;
}
for(int j = start; j < nums.length; j++) {
List<Integer> copy = new ArrayList<Integer>(list);
copy.add(nums[j]);
dfs(res, copy, nums, j + 1);
}
}
}
```
## Backtracking Solution
```cpp=
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums)
{
vector<vector<int>> ans;
vector<int> buf;
for ( int i = 0; i <= nums.size(); i++ )
{
FindSolutions( ans, nums, i, 0, buf );
}
return ans;
}
void FindSolutions( vector<vector<int>>& ans, const vector<int>& nums,
const int& k, const int& t, vector<int> buf )
{
if ( 0 == k )
{
ans.push_back({});
return;
}
if ( buf.size() == k )
{
ans.push_back(buf);
return;
}
for ( int i = t; i < nums.size(); i++ )
{
//decision to choose the element into subset
buf.push_back( nums[i] );
FindSolutions( ans, nums, k, i+1, buf );
//decision NOT to choose the element into subset
buf.pop_back();
}
}
};
```
## DFS solution
```cpp=
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
vector<vector<int>> result;
dfs(result, 0, nums, {});
return result;
}
void dfs(vector<vector<int>>& result, int index, vector<int>& nums, vector<int> current){
result.push_back(current);
for(int i=index;i<nums.size();i++){
current.push_back(nums[i]);
dfs(result, i+1, nums, current);
current.pop_back();
}
}
};
```
## bit mask solution
```cpp=
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
vector<vector<int>> ans;
vector<int> a;
int n = nums.size();
for(int i=0; i < (1<<n); i++){
a.clear();
for(int j=0;j<n;j++){
if(i & (1<<j)) a.push_back(nums[j]);
}
ans.push_back(a);
}
return ans;
}
};
```