78. Subsets
相似问题46. Permutations
题解46 Answer
方法一
思路
利用bitmap
所给数组是a[n],则所有的方法总数是2^n的个数
所有的组合形式是0-2^n-1的二进制数
>
Number of subsets for {1 , 2 , 3 } = 2^3 . why ?
case possible outcomes for the set of subsets
1 -> Take or dont take = 2
2 -> Take or dont take = 2
3 -> Take or dont take = 2
therefore , total = 222 = 2^3 = { { } , {1} , {2} , {3} , {1,2} , {1,3} , {2,3} , {1,2,3} }
Lets assign bits to each outcome -> First bit to 1 , Second bit to 2 and third bit to 3
Take = 1
Dont take = 0
0) 0 0 0 -> Dont take 3 , Dont take 2 , Dont take 1 = { }
1) 0 0 1 -> Dont take 3 , Dont take 2 , take 1 = {1 }
2) 0 1 0 -> Dont take 3 , take 2 , Dont take 1 = { 2 }
3) 0 1 1 -> Dont take 3 , take 2 , take 1 = { 1 , 2 }
4) 1 0 0 -> take 3 , Dont take 2 , Dont take 1 = { 3 }
5) 1 0 1 -> take 3 , Dont take 2 , take 1 = { 1 , 3 }
6) 1 1 0 -> take 3 , take 2 , Dont take 1 = { 2 , 3 }
7) 1 1 1 -> take 3 , take 2 , take 1 = { 1 , 2 , 3 }
In the above logic ,Insert S[i] only if (j>>i)&1 ==true { j E { 0,1,2,3,4,5,6,7 } i = ith element in the input array }
element 1 is inserted only into those places where 1st bit of j is 1
if( j >> 0 &1 ) ==> for above above eg. this is true for sl.no.( j )= 1 , 3 , 5 , 7
element 2 is inserted only into those places where 2nd bit of j is 1
if( j >> 1 &1 ) == for above above eg. this is true for sl.no.( j ) = 2 , 3 , 6 , 7
element 3 is inserted only into those places where 3rd bit of j is 1
if( j >> 2 & 1 ) == for above above eg. this is true for sl.no.( j ) = 4 , 5 , 6 , 7
Time complexity : O(n*2^n) , for every input element loop traverses the whole solution set length i.e. 2^n
reference:bitmap solution
代码
|
|
方法二
思路
递归遍历,有点像dfs
subsets = {1 , 2 , 3 }
添加顺序为
{}
{1}
{1,2}
{1,2,3}
{1,3}//path.remove(path.size() - 1),此时i=3,退回i=2,添加3
{2}
{2,3}
{3}
代码
|
|
方法三
思路
循环遍历
- 在结果集中添加一个空元素
- 遍历每个数字
2.1 ,遍历所有结果集中的结果,将这个数字添加到每个结果中
2.2 更新结果集
subsets = {1 , 2 , 3 }
添加顺序为
{} //add empty
{1} // add 1to {}, add 1 for ends
{2} //add to {},{1}
{1,2} //add 2 for ends
{3} // add 3 to {}, {1}, {2}, {1,2}
{1,3}
{2,3}
{1,2,3} //add 3 for ends
代码
- 错误一
java.util.ConcurrentModificationException
- 错误二
添加关联影响
- 正确代码
|
|