回溯
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
var permute = function (nums) { let res = []; function backtrack(cur, arr) { if (cur.length === nums.length) { res.push([...cur]); return; } for (let i = 0; i < arr.length; i++) { const item = arr[i]; const arrBack = arr.slice(); arrBack.splice(i, 1); backtrack([...cur, item], arrBack); } } backtrack([], nums); return res; };
|
优化1
每次arr.splice
和arr.slice
开销太大,使用used
标志来控制
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
|
var permute = function (nums) { let res = []; const used = Array.from({ length: nums.length }).fill(false); function backtrack(path) { if (path.length === nums.length) { res.push([...path]); return; } for (let i = 0; i < nums.length; i++) { if (used[i]) continue; used[i] = true; path.push(nums[i]); backtrack(path); path.pop(); used[i] = false; } } backtrack([]); return res; };
|
优化2
原地交换法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
var permute = function (nums) { let res = []; function backtrack(start) { if (start === nums.length) { res.push([...nums]); return; } for (let i = start; i < nums.length; i++) { [nums[start], nums[i]] = [nums[i], nums[start]]; backtrack(start + 1); [nums[start], nums[i]] = [nums[i], nums[start]]; } } backtrack(0); return res; };
|