算法:数组的子集(DFS)

题目:给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集。

思路:深度优先搜索(DFS)

图解:

                                     

从结果看思路:按照dfs方法体中第一行每次添加的结果顺序

  1. []
  2. 1
  3. 1,2
  4. 1,2,3
  5. 1,3
  6. 2
  7. 2,3
  8. 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
        )

)
发布了200 篇原创文章 · 获赞 26 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/why444216978/article/details/103334559
今日推荐