回溯的应用之数组全排列

回溯模板

  1. function backtrack(path) {
  2. if (结束条件) {
  3. return;
  4. }
  5. for (循环条件) {
  6. // 添加数据
  7. path.add(数据);
  8. // 递归调用
  9. backtrack(path);
  10. // 移除数据
  11. path.remove(数据);
  12. }
  13. return ans;
  14. }
JavaScript

代码实现

  1. /**
  2. * 全排列
  3. * @param {any[]} arr 数组
  4. * @returns
  5. */
  6. function permute(arr) {
  7. const ans = [];
  8. const used = Array(arr.length);
  9. function backtrack(path) {
  10. if (path.length === arr.length) {
  11. ans.push([...path]);
  12. return;
  13. }
  14. for (let i = 0; i < arr.length; i++) {
  15. if (used[i]) continue;
  16. path.push(arr[i]);
  17. used[i] = true;
  18. backtrack(path);
  19. path.pop();
  20. used[i] = false;
  21. }
  22. return ans;
  23. }
  24. return backtrack([]);
  25. }
JavaScript

测试

  1. console.log(permute([1, 2, 3]));
  2. // [
  3. // [ 1, 2, 3 ],
  4. // [ 1, 3, 2 ],
  5. // [ 2, 1, 3 ],
  6. // [ 2, 3, 1 ],
  7. // [ 3, 1, 2 ],
  8. // [ 3, 2, 1 ]
  9. // ]
JavaScript
编程笔记 & 随笔杂谈