https://leetcode-cn.com/problems/permutations/solution/

解法1

  1. private List<List<Integer>> ans = new ArrayList<>();
  2. private LinkedList<Integer> path = new LinkedList<>();
  3. public List<List<Integer>> permute(int[] nums) {
  4. boolean[] used = new boolean[nums.length];
  5. process(nums, used);
  6. return ans;
  7. }
  8. //nums中无重复数字
  9. private void process(int[] nums, boolean[] used ) {
  10. if (path.size() == nums.length) {
  11. ans.add(new ArrayList<>(path));
  12. return;
  13. }
  14. for (int i = 0; i < nums.length; i++) {
  15. if (used[i]) {
  16. continue;
  17. }
  18. path.add(nums[i]);
  19. used[i] = true;
  20. process(nums, used);
  21. used[i] = false;
  22. path.removeLast();
  23. }
  24. }

解法2

  • i位置只能跟它自己及它后面的数交换

image.png

  1. // 最优解
  2. public List<List<Integer>> permute(int[] nums) {
  3. List<List<Integer>> ans = new ArrayList<>();
  4. process(nums, 0, ans);
  5. return ans;
  6. }
  7. public void process(int[] nums, int index, List<List<Integer>> ans) {
  8. if (index == nums.length) {
  9. ArrayList<Integer> cur = new ArrayList<>();
  10. for (int num : nums) {
  11. cur.add(num);
  12. }
  13. ans.add(cur);
  14. } else {
  15. for (int j = index; j < nums.length; j++) {
  16. swap(nums, index, j);
  17. process(nums, index + 1, ans);
  18. swap(nums, index, j);
  19. }
  20. }
  21. }
  22. private void swap(int[] nums, int i, int j) {
  23. int tmp = nums[i];
  24. nums[i] = nums[j];
  25. nums[j] = tmp;
  26. }