当前位置: 面试刷题>> 全排列Ⅰ (经典算法题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 示例代码

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 示例代码

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 示例代码

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 编写全排列问题的解决方案。码小课网站中有更多相关内容分享给大家学习,包括回溯算法的其他应用和优化方法。

推荐面试题