当前位置: 面试刷题>> 带重复元素的排列 (经典算法题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 示例代码 ```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 示例代码 ```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 示例代码 ```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); ``` **码小课网站中有更多相关内容分享给大家学习**,包括但不限于算法题解、数据结构、面试技巧等,欢迎访问码小课网站获取更多学习资源。
推荐面试题