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

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

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

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 实现了全排列算法,并给出了示例用法。在实际面试中,可以根据具体需求调整和优化代码。

推荐面试题