package 积累;
import java.util.Arrays;
public class 不带重复元素的全排列 {
static int[] arr = new int[]{1, 2,2};
public static void main(String[] args) {
int[] path = new int[3];
f(path, 0);
}
private static void f(int[] path, int k) {
if(k==path.length){
System.out.println(Arrays.toString(path));
}
for (int i = 0; i < arr.length; i++) {
if(i>0&&arr[i]==arr[i-1]&&!t[i-1])continue;//如果上个元素没用过,并且这个元素和上个元素相等,那么跳过这个元素
if(!t[i]){
t[i] = true;//将元素标记成用过的
path[k] = arr[i];//将元素放入记录的数组
f(path,k+1);//递归
t[i] = false;//回溯
}
}
}
static boolean[] t = new boolean[3];
}
思想:
将使用过的元素进行标记,如果//如果上个元素没用过,并且这个元素和上个元素相等,那么跳过这个元素,
优点:,相比于java传统的java全排列,这个方法进行了剪枝,可以使效率更高;
缺点:但这种方法只适用于,连续重复的数组,如:[1,1,1,2,2,2]
像这种就不行,如[1,2,1,2]