没有重复元素的全排列

  1. 需要使用一个 boolean[] visited 表示该元素是否已经被访问过。
  2. for 循环遍历一直需要从 0 开始。

    1. class Solution {
    2. List<List<Integer>> res;
    3. public List<List<Integer>> permute(int[] nums) {
    4. if (nums == null || nums.length == 0) return new ArrayList<>();
    5. res = new ArrayList<>();
    6. // 全排列
    7. int len = nums.length;
    8. boolean[] visited = new boolean[len];
    9. List<Integer> path = new ArrayList<>();
    10. backTracking(nums, 0, len, path, visited);
    11. return res;
    12. }
    13. private void backTracking(int[] nums, int pos, int len, List<Integer> path, boolean[] visited) {
    14. if (path.size() == len) {
    15. // collect
    16. res.add(new ArrayList<>(path));
    17. return ;
    18. }
    19. for (int i = 0; i < len; i++) {
    20. if (visited[i]) continue;
    21. path.add(nums[i]);
    22. visited[i] = true;
    23. backTracking(nums, i + 1, len, path, visited);
    24. path.remove(path.size() - 1);
    25. visited[i] = false;
    26. }
    27. }
    28. }