数字的排列

Combination

https://leetcode.com/problems/combinations/
整形n,给定一个k,求n个数字里面k个组合

res记录最终结果,out记录单次结果(res是out的组合),在组合过程中,从1到n遍历数字,每次的结果都保存到out,只要out的长度满足了k,则表明找到了一个结果,回溯到下一个继续迭代。下图比较好的能说明整个迭代的过程

数字的排列_第1张图片
image.png
 /**
     * combine
     * @param $n
     * @param $k
     * @return array
     */
    function combine($n, $k) {
        $out = [];
        $res = [];
        $this->combineHelper($n, $k, 1, $out, $res);
        return $res;
    }


    /**
     * combineHelper
     * @param $n
     * @param $k
     * @param $level
     * @param $out
     * @param $res
     * @return void
     * @brief 这个函数的定义:对于n和k,找到level到n的所有满足条件的组合,并放在res中
     */
    function combineHelper($n, $k, $level, &$out, &$res) {
        if (count($out) == $k) {
            $res[] = $out;
            return;
        }

        for ($i = $level; $i <= $n; $i++) {
            $out[] = $i;
            $this->combineHelper($n, $k, $i+1, $out, $res);
            array_pop($out);
        }
    }

你可能感兴趣的:(数字的排列)