47. 全排列 II

难度中等776
给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。

示例 1:
输入:nums = [1,1,2] 输出: [[1,1,2], [1,2,1], [2,1,1]]
示例 2:
输入:nums = [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

提示:

  • 1 <= nums.length <= 8
  • -10 <= nums[i] <= 10

通过次数199,290
提交次数313,477

  1. class Solution {
  2. /**
  3. * @param Integer[] $nums
  4. * @return Integer[][]
  5. */
  6. function permuteUnique($nums) {
  7. $ret = [];
  8. if(!$nums) return $ret;
  9. sort($nums);//排序
  10. $this->permuteCore($nums, 0, $ret);
  11. return $ret;
  12. }
  13. // 回溯求解
  14. function permuteCore($nums, $begin, &$ret){
  15. $len = count($nums);
  16. if($begin >= $len){ // 到达最后一元素 打印该排列
  17. $res = [];
  18. foreach($nums as $num){
  19. $res[] = $num;
  20. }
  21. $ret[] = $res;
  22. return ;
  23. }
  24. for ($i = $begin; $i < $len; ++$i) {
  25. // 如果后续有重复数字 不需要交换
  26. if($i!=$begin && $nums[$i] == $nums[$begin]) continue;
  27. $temp = $nums[$begin];// 交换首元素和i位置元素
  28. $nums[$begin] = $nums[$i];
  29. $nums[$i] = $temp;
  30. $this->permuteCore($nums, $begin+1, $ret); // 递归到下一个元素
  31. //$temp = $nums[$begin];// 恢复交换前位置
  32. //$nums[$begin] = $nums[$i];
  33. //$nums[$i] = $temp;
  34. }
  35. }
  36. }