java 实现的用递归法实现全排列问题

算法设计与分析 王晓东 感谢老师

Perm(list,k,m)

1.当 k == m,即元素已经全排列,那么输出打印即可。

2当 k+1 = m ,那么此时只有两个元素,输出两种排列情况:原数列,交换后的数列。

3.当 k+2 = m,那么此时有三个元素。设顺序确定为x1x2x3.

1)  X1不变,对剩下的两个元素全排列,如2

2)  交换x1x2,对剩下的两个元素全排列,如2

3)交换x1,x3,对剩下的两个元素全排列,如2

4.当 k+3 = m,那么此时有四个元素。设顺序确定为x1x2x3x4

1)  X1不变,对剩下的三个元素全排列,如3

2)  交换x1x2,对剩下的三个元素全排列,如3

3)交换x1x3,对剩下的三个元素全排列,如3

4) 交换x1x4,对剩下的三个元素全排列,如3

以此类推,直到k==m。递归调用结束。

用图表示如下;



package com.wjl;

public class Perm
{
	static int count = 0;
	public void perm(int[] list, int k, int m)
	{
		if(k == m)
		{
			for(int i= 0; i<= m; i++)
			{
				System.out.println(list[i]);
			}
			System.out.println("排列数:"+(++count));
			
		}
		else 
			for(int i = k; i<= m; i++)
			{
				System.out.println("before "+list[k]+" "+list[m]);
				MyMath.swap(list, k, i);
				System.out.println("after "+list[k]+" "+list[m]);
				perm(list,k+1,m);
				MyMath.swap(list, k,i);				
			}
	}
	public static void main(String[] args)
	{
		int[] list = new int[]{1,2,3,4};
		Perm p = new Perm();
		p.perm(list,0,3);
	}
}


好的,下面是用 Java 实现回溯解决全排列问题的代码: ```java import java.util.ArrayList; import java.util.List; public class Permutations { public List<List<Integer>> permute(int[] nums) { List<List<Integer>> result = new ArrayList<>(); List<Integer> temp = new ArrayList<>(); boolean[] used = new boolean[nums.length]; backtrack(nums, used, temp, result); return result; } private void backtrack(int[] nums, boolean[] used, List<Integer> temp, List<List<Integer>> result) { if (temp.size() == nums.length) { result.add(new ArrayList<>(temp)); return; } for (int i = 0; i < nums.length; i++) { if (used[i]) { continue; } temp.add(nums[i]); used[i] = true; backtrack(nums, used, temp, result); temp.remove(temp.size() - 1); used[i] = false; } } } ``` 以上代码中,`permute` 方是入口方,接收一个整数数组,返回全排列的结果。在 `permute` 方中,我们定义了一个布尔数组 `used` 来表示每个元素是否已经使用过,还定义了一个 `temp` 列表来存储每个排列的中间结果。然后调用 `backtrack` 方来进行回溯。 在 `backtrack` 方中,我们首先判断是否已经找到了一个完整的排列,如果是,就将当前的 `temp` 列表加入到 `result` 列表中。否则,我们遍历整个数组,对于每个元素,如果它已经使用过,就跳过;否则,将其添加到 `temp` 列表中,并将 `used` 数组中对应的值设置为 `true`,然后递归调用 `backtrack` 方。在递归调用之后,我们需要将 `temp` 列表中的最后一个元素移除,并将 `used` 数组中对应的值设为 `false`,这样才能进行下一次回溯。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值