题目

image.png

思路

  • 思路:使用回溯来选择不同的分支以达到排列结果,但是如何知道那些结果已经使用过,就需要一个数组记录已使用的数据

    代码

    1. List<List<Integer>> res = new ArrayList<>();
    2. public List<List<Integer>> permute(int[] nums) {
    3. boolean[] visited = new boolean[nums.length];
    4. recur(new ArrayList<>(), visited, nums);
    5. return res;
    6. }
    7. public void recur(List<Integer> cur, boolean[] visited, int[] nums) {
    8. if (cur.size() == nums.length) {
    9. res.add(cur);
    10. return;
    11. }
    12. for (int i = 0; i < nums.length; i++) {
    13. if (!visited[i]) {
    14. visited[i] = true;
    15. List<Integer> list = new ArrayList<>(cur);
    16. list.add(nums[i]);
    17. recur(list, visited, nums);
    18. visited[i] = false;
    19. }
    20. }
    21. }
    22. //修改一下写法
    23. public List<List<Integer>> permute(int[] nums) {
    24. List<List<Integer>> res = new ArrayList<>();
    25. recur(res, new ArrayList<>(), nums);
    26. return res;
    27. }
    28. public void recur(List<List<Integer>> res, List<Integer> cur, int[] nums) {
    29. if (cur.size() == nums.length) {
    30. res.add(new ArrayList<>(cur));
    31. return;
    32. }
    33. for (int i = 0; i < nums.length; i++) {
    34. if (nums[i] == Integer.MAX_VALUE) continue;
    35. cur.add(nums[i]);
    36. nums[i] = Integer.MAX_VALUE;
    37. recur(res, cur, nums);
    38. nums[i] = cur.remove(cur.size() - 1);
    39. }
    40. }

    全排列