当前位置: 面试刷题>> 带重复元素的排列 (经典算法题500道)


题目描述补充

题目:带重复元素的排列

给定一个可能包含重复数字的数组,返回其所有可能的全排列。要求结果中的排列不重复。

示例 1:

输入: [1,1,2]
输出:
[
  [1,1,2],
  [1,2,1],
  [2,1,1]
]

示例 2:

输入: [1,2,3]
输出:
[
  [1,2,3],
  [1,3,2],
  [2,1,3],
  [2,3,1],
  [3,2,1],
  [3,1,2]
]

解题思路

对于带重复元素的排列问题,我们可以使用回溯法来解决,但需要注意在回溯过程中跳过重复的排列。这通常通过在递归调用之前和之后对数组进行排序,并在递归过程中跳过与前一个元素相同的元素来实现。

PHP 示例代码

function permuteUnique($nums) {
    sort($nums); // 先排序,以便后续跳过重复元素
    $result = [];
    backtrack($nums, [], $result);
    return $result;
}

function backtrack(&$nums, $temp, &$result) {
    if (count($temp) == count($nums)) {
        $result[] = $temp;
        return;
    }
    
    for ($i = 0; $i < count($nums); $i++) {
        // 跳过重复元素
        if ($i > 0 && $nums[$i] == $nums[$i - 1] && in_array($nums[$i], $temp)) {
            continue;
        }
        
        $temp[] = $nums[$i];
        backtrack($nums, $temp, $result);
        array_pop($temp);
    }
}

// 示例用法
$nums = [1, 1, 2];
$result = permuteUnique($nums);
print_r($result);

Python 示例代码

def permuteUnique(nums):
    def backtrack(first=0):
        if first == n:
            output.append(nums[:])
        for i in range(first, n):
            # 确保不选择重复的元素
            if i > first and nums[i] == nums[i-1]:
                continue
            nums[first], nums[i] = nums[i], nums[first]
            backtrack(first + 1)
            nums[first], nums[i] = nums[i], nums[first]

    nums.sort()
    n = len(nums)
    output = []
    backtrack()
    return output

# 示例用法
nums = [1, 1, 2]
result = permuteUnique(nums)
print(result)

JavaScript 示例代码

function permuteUnique(nums) {
    nums.sort((a, b) => a - b);
    const result = [];
    const backtrack = (first = 0) => {
        if (first === nums.length) {
            result.push([...nums]);
            return;
        }
        for (let i = first; i < nums.length; i++) {
            if (i > first && nums[i] === nums[i - 1]) continue; // 跳过重复
            [nums[first], nums[i]] = [nums[i], nums[first]];
            backtrack(first + 1);
            [nums[first], nums[i]] = [nums[i], nums[first]];
        }
    };
    backtrack();
    return result;
}

// 示例用法
const nums = [1, 1, 2];
const result = permuteUnique(nums);
console.log(result);

码小课网站中有更多相关内容分享给大家学习,包括但不限于算法题解、数据结构、面试技巧等,欢迎访问码小课网站获取更多学习资源。

推荐面试题