抓取法生成全排列(没有重复元素的递归求解)

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;
			}
		}
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值