题目:给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集。
思路:深度优先搜索(DFS)
图解:
从结果看思路:按照dfs方法体中第一行每次添加的结果顺序
- []
- 1
- 1,2
- 1,2,3
- 1,3
- 2
- 2,3
- 3
代码:
<?php
function dfs($nums, $start, $node, &$res){
array_push($res, $node); //每次进入一个子节点时,结果集中加入当前组合
for($i = $start; $i < count($nums); $i++){ //外层循环:设置每个节点的起始元素
array_push($node, $nums[$i]); //入栈,填充每个节点
dfs($nums, $i + 1, $node, $res ); //递归点:计算下一个元素开始的组合
array_pop($node); //回溯点:移除栈尾元素,比如1,2,3移除3回到父元素1,2
}
}
$nums = [1, 2, 3];
$size = count($nums);
if($size == 0){
return [];
}
$res = [];
dfs($nums, 0, [], $res);
print_r($res);
运行结果:
Array
(
[0] => Array
(
)
[1] => Array
(
[0] => 1
)
[2] => Array
(
[0] => 1
[1] => 2
)
[3] => Array
(
[0] => 1
[1] => 2
[2] => 3
)
[4] => Array
(
[0] => 1
[1] => 3
)
[5] => Array
(
[0] => 2
)
[6] => Array
(
[0] => 2
[1] => 3
)
[7] => Array
(
[0] => 3
)
)