51 lines
1.5 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* @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
}