leetcode 46. Permutations(考全排列)

Given a collection of distinct numbers, return all possible permutations.

For example,
[1,2,3] have the following permutations:

[
  [1,2,3],
  [1,3,2],
  [2,1,3],
  [2,3,1],
  [3,1,2],
  [3,2,1]
]
总而言之,就是要你求给定数组的全排列

思路:

一开始看这题就想着用递归,就按递归的写法来吧

举个列子,假定一个数组是a[3]={0,1,2},用交换的方法来排列

那么先固定第一个数0,交换后面两个数1,2,得到两种排列

之后第一个数与第二个数交换,得到a[]={1,0,2}

固定第一个数1,交换后面两个数0,2,得到两种排列

为了防止重复,需要每次都恢复成原来的数组{0,1,2}

之后第一个数与第三个数交换,得到a[]={2,1,0}

固定第一个数2,交换后面两个数1,0,得到两种排列

...以此类推

因此可以看到固定的套路就是,固定第一个数,交换后面的数,得到排列

当数组的长度为n时,每一次循环,最外层的递归是以start为起点的数组,每个数组的值依次和以start为下标的值交换,递归达到最底层时,就是最后一个数自己和自己交换(第一个swap),此时start的值等于数组长度,将排列结果加入到集合中,然后复原(第二个swap),返回上层递归,就是倒数一个数和倒数第二个数交换(第一个swap),再进到底层递归,最后一个数自己和自己交换,此时由于之前已经被交换过,所以现在出现第二种排列,此时start的值等于数组长度,将排列结果加入到集合中,然后复原(第二个swap)...


代码如下

public class Solution {
    public List<List<Integer>> permute(int[] nums) {
		 List<List<Integer>> lists = new ArrayList<>();
		 execute(lists,nums,0,nums.length);
		 return lists;
	    }
	 
	 public void execute(List<List<Integer>> lists,
			 	int[] nums,int start,int length){
		 if(start == length)
		 {
			 List<Integer> list = new ArrayList<>();
			 for(int i=0;i<length;i++)
			 {
				 list.add(nums[i]);
			 }
			 lists.add(list);
		 }
		 else
		 {
			 for(int j=start;j<length;j++)
			 {
				 swap(nums,j,start);
				 execute(lists,nums,start+1,length);
				 swap(nums,j,start);
			 }
		 }
	 }
	 
	 public void swap(int[] nums,int a,int b){
		 int t;
		 t = nums[a];
		 nums[a] = nums[b];
		 nums[b] = t;
	 }
}

这种比较好理解,能AC。

全排列的算法还有很多,其他自己百度吧


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值