46. Permutations

数组交换元素法

这里的回溯在于:

  1. 在前index-1个元素的位置有确定的情况下
  2. index 这个位置,可以由index->nums.length的每个位置的元素担任

    1. 所以用一个for循环来把各个元素换到index这个位置上

      1. class Solution {
      2. public List<List<Integer>> permute(int[] nums) {
      3. Arrays.sort(nums);
      4. List<List<Integer>> result = new ArrayList<>();
      5. permute(nums, 0, result);
      6. return result;
      7. }
      8. private void permute(int[] nums, int index, List<List<Integer>> result) {
      9. if(index == nums.length) {
      10. result.add(convertArrayToList(nums));
      11. } else {
      12. for(int i = index; i < nums.length; i++) {
      13. swap(nums, index, i);
      14. permute(nums, index + 1, result );
      15. swap(nums, index, i);
      16. }
      17. }
      18. }
      19. private void swap(int[] nums, int i, int j) {
      20. int temp = nums[i];
      21. nums[i] = nums[j];
      22. nums[j] = temp;
      23. }
      24. private List<Integer> convertArrayToList(int[] nums) {
      25. List<Integer> list = new ArrayList<>();
      26. for(int i : nums) {
      27. list.add(i);
      28. }
      29. return list;
      30. }
      31. }

子集添加元素法

  1. 新建一个子集
  2. 回溯法,每次往子集里面加一个之前没加过的元素

    1. class Solution {
    2. public List<List<Integer>> permute(int[] nums) {
    3. List<List<Integer>> result = new ArrayList<>();
    4. permute(nums, new ArrayList<>(), result);
    5. return result;
    6. }
    7. private void permute(int[] nums, List<Integer> subSet, List<List<Integer>> result) {
    8. if(subSet.size() == nums.length) {
    9. result.add(new ArrayList<>(subSet));
    10. } else {
    11. for(int i = 0; i < nums.length; i++) {
    12. if(!subSet.contains(nums[i])) {
    13. subSet.add(nums[i]);
    14. permute(nums, subSet, result);
    15. subSet.remove(subSet.size()-1);
    16. }
    17. }
    18. }
    19. }
    20. }