题目
给出一个集合,请输出该集合的所有子集,含空子集。
示例 1:
输入: [1,2,3]
输出: [[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
解释:
1,迭代法
思路就是每一轮取一个元素,然后把它加入到已产生的子集中,产生新的子集
/**
* 获取一个集合的所有子集,包含空子集,不排序
* @param $arr array
* @return array 二维数组
*/
function getAllSub(array $arr) : array {
if (count($arr) <= 1) {
return $arr;
}
$result = [];
$result[] = []; //这里把空子集第一个放入,是为了在后续的遍历中,把每个单个成员放入其中,作为子集
foreach ($arr as $member) {
//对现有的结果遍历,将每个元素复制出来,再将新成员加入到其中,最后将它作为新元素加入到结果中
$count = count($result);
for ($i = 0; $i < $count; $i++) {
$newSub = $result[$i];
$newSub[] = $member;//加入新成员
$result[] = $newSub;//将新元素加入到结果中
}
}
return $result;
}
输入
$arr = ['a', 'b', 'c', 'd'];
$res = getAllSub($arr);
print_r($res);
输出
Array
(
[0] => Array
(
)
[1] => Array
(
[0] => a
)
[2] => Array
(
[0] => b
)
[3] => Array
(
[0] => a
[1] => b
)
[4] => Array
(
[0] => c
)
[5] => Array
(
[0] => a
[1] => c
)
[6] => Array
(
[0] => b
[1] => c
)
[7] => Array
(
[0] => a
[1] => b
[2] => c
)
[8] => Array
(
[0] => d
)
[9] => Array
(
[0] => a
[1] => d
)
[10] => Array
(
[0] => b
[1] => d
)
[11] => Array
(
[0] => a
[1] => b
[2] => d
)
[12] => Array
(
[0] => c
[1] => d
)
[13] => Array
(
[0] => a
[1] => c
[2] => d
)
[14] => Array
(
[0] => b
[1] => c
[2] => d
)
[15] => Array
(
[0] => a
[1] => b
[2] => c
[3] => d
)
)
时间复杂度: O(n^2)
2,位图法
思路就是用0/1位值来控制是否展示,所有情况都出现一次,则获取到所有子集。例如 0000 就表示所有都不展示,就是空子集,0001就表示 [d]。结果个数刚好是 2^4 = 16.
代码
/**
* 获取一个集合的所有子集,包含空子集,不排序
* @param $arr array
* @return array 一维数组
*/
function getAllSubByBit(array $arr) : array {
$count = count($arr);
if ($count <= 1) {
return $arr;
}
$arr = array_reverse($arr); //O(n) 主要是为了结果可读性,可注释
$result = [];
$total = pow(2, $count);
for ($i=0; $i
//把十进制转换为二进制字符串
$bitStr = decbin($i);
$bitLen = strlen($bitStr);
//从低位开始分别取出
$tmp = '';
for ($j=$count-1, $k=$bitLen-1; $j>=0 && $k>=0; $j--, $k--) { //O(n)
$letter = $arr[$j];
$bitNumber = $bitStr[$k];
$displayRes = $bitNumber == 1 ? $letter : ''; //位值为1则展示,否则为空字符串
$tmp .= $displayRes;
}
$result[] = $tmp;
}
return $result;
}
输入
$arr = ['a', 'b', 'c', 'd'];
$res = getAllSubByBit($arr);
print_r($res);
输出
Array
(
[0] =>
[1] => a
[2] => b
[3] => ab
[4] => c
[5] => ac
[6] => bc
[7] => abc
[8] => d
[9] => ad
[10] => bd
[11] => abd
[12] => cd
[13] => acd
[14] => bcd
[15] => abcd
)