源题目
https://leetcode-cn.com/problems/permutations/
46. 全排列
难度中等1502
给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
示例 1:
输入:nums = [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
示例 2:
输入:nums = [0,1] 输出:[[0,1],[1,0]]
示例 3:
输入:nums = [1] 输出:[[1]]
提示:
- 1 <= nums.length <= 6
- -10 <= nums[i] <= 10
- nums 中的所有整数 互不相同
通过次数389,617
提交次数498,182
class Solution {
/**
* @param Integer[] $nums
* @return Integer[][]
*/
function permute($nums) {
$ret = [];
if(!$nums) return $ret;
$this->permuteCore($nums, 0, $ret);
return $ret;
}
// 回溯求解
function permuteCore(&$nums, $begin, &$ret){
$len = count($nums);
if($begin >= $len){ // 到达最后一元素 打印该排列
$res = [];
foreach($nums as $num){
$res[] = $num;
}
$ret[] = $res;
return ;
}
for ($i = $begin; $i < $len; ++$i) {
$temp = $nums[$begin];// 交换首元素和i位置元素
$nums[$begin] = $nums[$i];
$nums[$i] = $temp;
$this->permuteCore($nums, $begin+1, $ret); // 递归到下一个元素
$temp = $nums[$begin];// 恢复交换前位置
$nums[$begin] = $nums[$i];
$nums[$i] = $temp;
}
}
}