​welcome to my blog​

LeetCode Top 100 Liked Questions 46. Permutations (Java版; Medium)

题目描述

Given a collection of distinct integers, return all possible permutations.

Example:

Input: [1,2,3]
Output:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]

这道题跟"LC39组合总和"很像

class Solution {
public List<List<Integer>> permute(int[] nums) {
List<List<Integer>> list = new ArrayList<>();
List<Integer> al = new ArrayList<>();
core(list, al, nums, 0);
return list;
}

//index表示某个排列的第index个元素; 这个元素可以从[index,n-1]范围上选择
private void core(List<List<Integer>> list, List<Integer> al, int[] nums, int index){
//
if(index==nums.length){
list.add(new ArrayList<>(al));
return;
}
//
for(int i = index; i<nums.length; i++){
swap(nums, index, i);
al.add(nums[index]);
core(list, al, nums, index+1);
swap(nums, index, i);
al.remove(al.size()-1);
}

}

private void swap(int[] arr, int i, int j){
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
  • 方法:“回溯搜索”算法即“深度优先遍历 + 状态重置 + 剪枝”(这道题没有剪枝)
/*
每个位置尝试不同的可能, 使用回溯搜索法(DFS+状态重置)
*/
import java.util.List;
import java.util.ArrayList;

class Solution {
public List<List<Integer>> permute(int[] nums) {
List<List<Integer>> res = new ArrayList<>();
if(nums==null || nums.length==0)
return res;
//
Core(nums, 0, res);
return res;
}
public void Core(int[] nums, int k, List<List<Integer>> res){
//base case
if(k==nums.length){
res.add(new ArrayList<Integer>());
for(int i=0; i<nums.length; i++)
res.get(res.size()-1).add(nums[i]);
}
//k,...,nums.length-1
for(int i=k; i<nums.length; i++){
//change the scene
swap(nums, k, i);
//recursion
Core(nums, k+1, res);
//restore the scene
swap(nums, k, i);
}
}
public void swap(int[] arr, int i, int j){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}