题目描述
原题链接
给定一个不含重复数字的数组 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]]
提示:
Javascript
暴力解法
/*
* @lc app=leetcode.cn id=46 lang=javascript
*
* [46] 全排列
*/
// @lc code=start
/**
* @param {number[]} nums
* @return {number[][]}
*/
var permute = function (nums) {
if (nums.length === 1) {
return [nums];
}
let res = [[nums[0]]];
const len = nums.length;
let nowLength = 1;
for (let i = 1; i < len; i++) {
nowLength = res.length;
let arr = [];
for (let j = 0; j < nowLength; j++) {
const temp = res[j];
const tempLen = temp.length;
for (let k = 0; k < tempLen; k++) {
arr.push([...temp.slice(0, k), nums[i], ...temp.slice(k, tempLen)]);
}
console.log(arr);
arr.push([...temp, nums[i]]);
}
res = arr;
}
return res;
};
// @lc code=end
Java
class Solution {
public List<List<Integer>> permute(int[] nums) {
List<List<Integer>> result=new ArrayList<>();
int len=nums.length;
if (len == 0) {
return result;
}
List<Integer> list=new ArrayList<>();
boolean[] flag=new boolean[len];
dfs(result,0,len,list,nums,flag);
return result;
}
public void dfs(List<List<Integer>> result,int depth,int len,List<Integer> list,int[] nums,boolean[] flag){
if (depth==len){
result.add(new ArrayList<>(list));
return ;
}
for (int i=0;i<len;i++){
if (flag[i]==false){
list.add(nums[i]);
flag[i]=true;
dfs(result,depth+1, len, list, nums, flag);
flag[i]=false;
list.remove(list.size()-1);
}
}
}
}
其他解法
Java
Javascript
回溯算法。
/**
* @param {number[]} nums
* @return {number[][]}
*/
var permute = function(nums) {
let len = nums.length, result = [], visited = new Array(len).fill(false);
const dfs = (nums, len, depth, path, visited) => {
// 遍历到叶子结点了,可以返回了
if(depth === len) {
result.push([...path]);
}
for(let i = 0; i < len; i++) {
// 如果没遍历过
if(!visited[i]) {
// 压入 path 数组,然后是否遍历过的数组此下标处变为 true
path.push(nums[i]);
visited[i] = true;
// 继续 dfs,直到最后一层
dfs(nums, len, depth + 1, path, visited);
// 进行回溯,还原,以便下一次使用
visited[i] = false;
path.pop();
}
}
}
dfs(nums, len, 0, [], visited);
return result;
};