问题来源和描述
问题来源:LeetCode 47题:https://leetcode-cn.com/problems/permutations-ii/
给定一个可包含重复数字的序列,返回所有不重复的全排列。
思路:dfs
import java.util.*;
public class Main {
public static void main(String[] args) {
//输入需要全排列的数字
Scanner scanner = new Scanner(System.in);
String[] strs = scanner.nextLine().trim().split(" ");
int[] nums = new int[strs.length];
for (int i = 0; i < nums.length; i++) {
nums[i] = Integer.parseInt(strs[i]);
}
//得到全排列的结果
List<List<Integer>> res = permute(nums);
//输出结果
for (int i = 0; i < res.size(); i++) {
System.out.println(res.get(i).toString());
}
}
public static List<List<Integer>> permute(int[] nums) {
Arrays.sort(nums);
boolean[] vis = new boolean[nums.length];
List<List<Integer>> res = new ArrayList<>();
List<Integer> temp = new ArrayList<>();
dfs(nums, res, temp, 0, vis);
return res;
}
private static void dfs(int[] nums, List<List<Integer>> res, List<Integer> temp, int index, boolean[] vis) {
if (index == nums.length) {
res.add(new ArrayList<>(temp));
}
for (int i = 0; i < nums.length; i++) {
if (vis[i] || (i > 0 && nums[i] == nums[i-1] && !vis[i-1])) {
continue;
}
temp.add(nums[i]);
vis[i] = true;
//继续标记下一个位置
dfs(nums, res, temp, index+1, vis);
//回溯
vis[i] = false;
temp.remove(index);
}
}
}