源题目

https://leetcode-cn.com/problems/permutations/

46. 全排列

难度中等1502
给定一个不含重复数字的数组 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]]
示例 3:
输入:nums = [1] 输出:[[1]]

提示:

  • 1 <= nums.length <= 6
  • -10 <= nums[i] <= 10
  • nums 中的所有整数 互不相同

通过次数389,617
提交次数498,182

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