当前位置: 面试刷题>> 全排列(经典算法150题)


### 题目描述 **题目:全排列** 给定一个没有重复数字的数组 `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]] ``` ### 解题思路 全排列问题可以使用回溯法(backtracking)来解决。回溯法是一种通过穷举所有可能的候选解来找出所有解的算法。如果候选解被确认不是一个解(或者至少不是最后一个解),回溯算法会通过在上一步进行一些变化抛弃该解,即通过在上一步进行一些变化产生新的候选解。 ### PHP 代码示例 ```php function permute($nums) { $result = []; $visited = array_fill(0, count($nums), false); // 记录数字是否被访问过 backtrack($nums, $visited, [], $result); return $result; } function backtrack($nums, &$visited, $temp, &$result) { if (count($temp) == count($nums)) { $result[] = $temp; return; } for ($i = 0; $i < count($nums); $i++) { if (!$visited[$i]) { $visited[$i] = true; $temp[] = $nums[$i]; backtrack($nums, $visited, $temp, $result); array_pop($temp); // 回溯 $visited[$i] = false; } } } // 示例用法 $nums = [1, 2, 3]; $result = permute($nums); print_r($result); ``` ### Python 代码示例 ```python def permute(nums): def backtrack(first=0): if first == n: output.append(nums[:]) for i in range(first, n): nums[first], nums[i] = nums[i], nums[first] backtrack(first + 1) nums[first], nums[i] = nums[i], nums[first] n = len(nums) output = [] backtrack() return output # 示例用法 nums = [1, 2, 3] print(permute(nums)) ``` ### JavaScript 代码示例 ```javascript function permute(nums) { const result = []; function backtrack(path, used) { if (path.length === nums.length) { result.push(path.slice()); return; } for (let i = 0; i < nums.length; i++) { if (!used[i]) { used[i] = true; path.push(nums[i]); backtrack(path, used); path.pop(); used[i] = false; } } } const used = new Array(nums.length).fill(false); backtrack([], used); return result; } // 示例用法 const nums = [1, 2, 3]; console.log(permute(nums)); ``` 以上代码示例分别用 PHP、Python 和 JavaScript 实现了全排列算法,并给出了示例用法。在实际面试中,可以根据具体需求调整和优化代码。
推荐面试题