题目描述

原题链接
给定一个不含重复数字的数组 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 中的所有整数 互不相同

    个人解法

Javascript

暴力解法

  1. /*
  2. * @lc app=leetcode.cn id=46 lang=javascript
  3. *
  4. * [46] 全排列
  5. */
  6. // @lc code=start
  7. /**
  8. * @param {number[]} nums
  9. * @return {number[][]}
  10. */
  11. var permute = function (nums) {
  12. if (nums.length === 1) {
  13. return [nums];
  14. }
  15. let res = [[nums[0]]];
  16. const len = nums.length;
  17. let nowLength = 1;
  18. for (let i = 1; i < len; i++) {
  19. nowLength = res.length;
  20. let arr = [];
  21. for (let j = 0; j < nowLength; j++) {
  22. const temp = res[j];
  23. const tempLen = temp.length;
  24. for (let k = 0; k < tempLen; k++) {
  25. arr.push([...temp.slice(0, k), nums[i], ...temp.slice(k, tempLen)]);
  26. }
  27. console.log(arr);
  28. arr.push([...temp, nums[i]]);
  29. }
  30. res = arr;
  31. }
  32. return res;
  33. };
  34. // @lc code=end

Java

  1. class Solution {
  2. public List<List<Integer>> permute(int[] nums) {
  3. List<List<Integer>> result=new ArrayList<>();
  4. int len=nums.length;
  5. if (len == 0) {
  6. return result;
  7. }
  8. List<Integer> list=new ArrayList<>();
  9. boolean[] flag=new boolean[len];
  10. dfs(result,0,len,list,nums,flag);
  11. return result;
  12. }
  13. public void dfs(List<List<Integer>> result,int depth,int len,List<Integer> list,int[] nums,boolean[] flag){
  14. if (depth==len){
  15. result.add(new ArrayList<>(list));
  16. return ;
  17. }
  18. for (int i=0;i<len;i++){
  19. if (flag[i]==false){
  20. list.add(nums[i]);
  21. flag[i]=true;
  22. dfs(result,depth+1, len, list, nums, flag);
  23. flag[i]=false;
  24. list.remove(list.size()-1);
  25. }
  26. }
  27. }
  28. }

其他解法

Java

Javascript

回溯算法。

  1. /**
  2. * @param {number[]} nums
  3. * @return {number[][]}
  4. */
  5. var permute = function(nums) {
  6. let len = nums.length, result = [], visited = new Array(len).fill(false);
  7. const dfs = (nums, len, depth, path, visited) => {
  8. // 遍历到叶子结点了,可以返回了
  9. if(depth === len) {
  10. result.push([...path]);
  11. }
  12. for(let i = 0; i < len; i++) {
  13. // 如果没遍历过
  14. if(!visited[i]) {
  15. // 压入 path 数组,然后是否遍历过的数组此下标处变为 true
  16. path.push(nums[i]);
  17. visited[i] = true;
  18. // 继续 dfs,直到最后一层
  19. dfs(nums, len, depth + 1, path, visited);
  20. // 进行回溯,还原,以便下一次使用
  21. visited[i] = false;
  22. path.pop();
  23. }
  24. }
  25. }
  26. dfs(nums, len, 0, [], visited);
  27. return result;
  28. };