全排列
力扣原题
给定一个不含重复数字的数组 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]]
/*** @param {number[]} nums* @return {number[][]}*/
var permute = function(nums) {const res = []const visited = {}function dfs(arr = []) {if(arr.length === nums.length) {res.push(arr)return}for(let i = 0; i < nums.length; i++) {if(!visited[i]) {visited[i] = 1dfs([...arr, nums[i]])visited[i] = 0}}}dfs()return res
};
解题思路
全排列,需要按照不同的开始顺序
,遍历所有的数组
,最开始容易理解的思路是,定义一个剩余数组restArr
,初始化为nums
,循环剩余数组的每一个值,取出来后放进arr
中,等restArr
为空时,此时的arr
即为一种全排列,如下示例:
/*** @param {number[]} nums* @return {number[][]}*/
var permute = function(nums) {const res = []// arr当前已取的数组, restArr剩余数组function dfs(arr, restArr) {// 剩余数组为空时,arr结果即为一种全排列if(!restArr.length) {res.push(arr)return}for(let i = 0; i < restArr.length; i++) {const num = restArr[i]// arr加入当前值const newArr = [...arr, num]// restArr取出当前值const newRestArr = [...restArr]newRestArr.splice(i, 1)dfs(newArr, newRestArr)}}dfs([], nums)return res
};
但是这种方案的缺点是需要不断构造数组操作数组,后面改造后的思路是:
- 使用
visited
对象存储数组下标
,设置为1:正在访问
。 - 等到
回溯
时,将这个数组下标
,设置回0:未访问状态
。