全排列-DFS
/**
* https://leetcode-cn.com/problems/permutations/
*/
public class _46_全排列3 {
public List<List<Integer>> permute(int[] nums) {
if (nums == null) return null;
List<List<Integer>> list = new ArrayList<>();
if (nums.length == 0) return list;
dfs(0, nums, list);
return list;
}
private void dfs(int idx, int[] nums, List<List<Integer>> list) {
// 不能再往下搜索
if (idx == nums.length) {
List<Integer> result = new ArrayList<>();
for (int value : nums) {
result.add(value);
}
list.add(result);
return;
}
// 枚举这一层所有可以做出的选择
for (int i = idx; i < nums.length; i++) {
swap(nums, idx, i);
dfs(idx + 1, nums, list);
swap(nums, idx, i);
}
}
private void swap(int[] nums, int i, int j) {
int tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}
}
/**
* https://leetcode-cn.com/problems/permutations/
*/
public class _46_全排列2 {
private List<List<Integer>> list;
private int[] nums;
/** 用来保存每一层选择的数字 */
private List<Integer> result;
public List<List<Integer>> permute(int[] nums) {
if (nums == null) return null;
list = new ArrayList<>();
if (nums.length == 0) return list;
this.nums = nums;
result = new ArrayList<>();
dfs(0);
return list;
}
private void dfs(int idx) {
// 不能再往下搜索
if (idx == nums.length) {
list.add(new ArrayList<>(result));
return;
}
// 枚举这一层所有可以做出的选择
for (int num : nums) {
if (result.contains(num)) continue;
result.add(num);
dfs(idx + 1);
result.remove(result.size() - 1);
}
}
}
/**
* https://leetcode-cn.com/problems/permutations/
*/
public class _46_全排列 {
private List<List<Integer>> list;
private int[] nums;
/** 用来保存每一层选择的数字 */
private int[] result;
/** 用来标记nums中的数字是否被使用过了 */
private boolean[] used;
public List<List<Integer>> permute(int[] nums) {
if (nums == null) return null;
list = new ArrayList<>();
if (nums.length == 0) return list;
this.nums = nums;
result = new int[nums.length];
used = new boolean[nums.length];
dfs(0);
return list;
}
private void dfs(int idx) {
// 不能再往下搜索
if (idx == nums.length) {
List<Integer> resultList = new ArrayList<>();
for (int value : result) {
resultList.add(value);
}
list.add(resultList);
return;
}
// 枚举这一层所有可以做出的选择
for (int i = 0; i < nums.length; i++) {
if (used[i]) continue;
result[idx] = nums[i];
used[i] = true;
dfs(idx + 1);
// 还原现场
used[i] = false;
}
}
}
浙公网安备 33010602011771号