当前位置: 面试刷题>> 全排列Ⅰ (经典算法题500道)
### 题目描述补充
**题目:全排列Ⅰ**
给定一个没有重复数字的数组 `nums`,返回其所有可能的全排列。你可以按任意顺序返回答案。
**示例 1**:
```
输入: nums = [1,2,3]
输出: [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,2,1],[3,1,2]]
```
**示例 2**:
```
输入: nums = [0,1]
输出: [[0,1],[1,0]]
```
### 解题思路
全排列问题是一个经典的回溯算法问题。回溯算法通过递归和剪枝来穷举所有可能的情况,然后找到满足条件的解。对于全排列问题,我们需要依次将数组中的每个元素放到排列的每一个位置,然后递归地处理剩下的元素。
### PHP 示例代码
```php
function permute($nums) {
$result = [];
backtrack($nums, [], $result);
return $result;
}
function backtrack($nums, $path, &$result) {
if (empty($nums)) {
$result[] = $path;
return;
}
foreach ($nums as $num) {
$index = array_search($num, $nums);
array_splice($nums, $index, 1); // 移除当前元素
$path[] = $num;
backtrack($nums, $path, $result);
array_splice($nums, $index, 0, [$num]); // 恢复数组
array_pop($path);
}
}
// 示例用法
$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]
result = permute(nums)
print(result)
```
### JavaScript 示例代码
```javascript
function permute(nums) {
const result = [];
function backtrack(path) {
if (path.length === nums.length) {
result.push([...path]);
return;
}
for (let i = 0; i < nums.length; i++) {
if (path.includes(nums[i])) continue; // 排除已使用的数字
path.push(nums[i]);
backtrack(path);
path.pop();
}
}
backtrack([]);
return result;
}
// 示例用法
const nums = [1, 2, 3];
const result = permute(nums);
console.log(result);
```
以上代码示例展示了如何使用 PHP、Python 和 JavaScript 编写全排列问题的解决方案。码小课网站中有更多相关内容分享给大家学习,包括回溯算法的其他应用和优化方法。