51 lines
1.5 KiB
JavaScript
51 lines
1.5 KiB
JavaScript
/**
|
||
* @param {number[]} nums
|
||
* @return {number[][]}
|
||
* http://leetcode.cn/problems/permutations/?envType=study-plan-v2&envId=top-interview-150
|
||
*/
|
||
const permute = function (nums) {
|
||
|
||
};
|
||
|
||
/*
|
||
利用回溯算法,递归的处理,每一次都从头开始遍历,收集每一个元素,由于是全排列,不能再结果中收集同一个元素
|
||
多次,所以定义一个used数组来标记是否已经收集,如果收集过就跳过处理下一个元素,如果path的长度和全排列的长度
|
||
一致,就将结果收集到result中,最后返回result
|
||
*/
|
||
function f2(nums) {
|
||
/**
|
||
*
|
||
* @param {Number[]} nums 所有元素
|
||
* @param {Boolean[]} used 对应位置的元素是否被使用过
|
||
* @param {Number[]} path 全排列的结果
|
||
*/
|
||
const backtrack = (nums, used, path) {
|
||
// 如果path的长度和nums的长度一致,收集结果
|
||
if(path.length === nums.length){
|
||
result.push(path)
|
||
return
|
||
}
|
||
|
||
// 递归处理
|
||
for(let i = 0; i<nums.length;i++){
|
||
// 如果当前值被使用过,直接跳过
|
||
if(used[i]) continue
|
||
// 将当前值加入path
|
||
path.push(nums[i])
|
||
used[i] = true
|
||
backtrack(nums, used, path)
|
||
// 下面是回溯过程,将nums[i]从path中取出,并标记为未被使用
|
||
path.pop();
|
||
used[i] = false
|
||
}
|
||
}
|
||
|
||
let result = []; // 收集所有全排列的结果
|
||
const n = nums.length;
|
||
const used = Array(n).fill(false);
|
||
const path = []; // 收集元素形成排列
|
||
// 调用回溯过程
|
||
backtrack(nums, used, path)
|
||
return result
|
||
}
|