1. 具体分析
生成没有重复元素全排列有很多种方法,可以使用交换当前位置的元素与当前位置以及之后位置的元素,然后递归求解,除了上面的方法之外我们还有一种方法就是尝试抓取的方法,对于当前的元素我尝试去抓取填到放结果的数组的对应的位置中,所以需要有一个标记当前元素是否被访问,我们可以使用一个数组来进行标记,对于当前没有被访问过的元素那么我们尝试填入到结果数组中,每一个位置我都尝试抓取数组中的每个元素,这样就可以使用递归求解下去,因为要尝试所有的可能性,之前标记过的元素,在这一层调用完之后我们需要进行回溯,也就是将之前比较过的元素恢复到之前没有被标记过的状态这样退回到这一层的递归调用的时候我可以尝试将for循环中的下一个元素填入到当前的位置
2. 具体的代码如下:
public class Main {
//没有重复元素的全排列
static int count;
static int visit[] = new int[10];
static int res[] = new int[10];
public static void main(String[] args) {
int arr[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
f(arr, 0);
System.out.println(count);
}
private static void f(int[] arr, int k) {
if(k == 10){
count++;
// if(count < 10){
// for(int i = 0; i < 10; i++){
// System.out.print(arr[i]);
// }
// System.out.println();
// }
return;
}
for(int i = 0; i < 10; i++){
if(visit[i] == 0){
visit[i] = 1;
res[k] = i;
f(arr, k + 1);
visit[i] = 0;
res[k] = 0;
}
}
}
}