递归之排列问题

问题描述:

给定一个数组,求数组元素的排列问题

算法思路:

采用递归的思想,设定集合R={r1,r2,r3,r4},Ri=R-ri,集合R中的元素的全排列记为P(R)
首先我们分为两种情况,R集合中只有一个元素和R集合中有多个元素
情况1:R集合中只有一个元素,这时集合R的全排列就只有一个
情况2:R集合中有多个元素,这时我们可以递归的进行求解。

举例说明:

集合R中有两个元素时:全排列为以r1开头的全排列加上以r2开头的全排列,这时只有{r1,r2}和{r2,r1}
集合R中有三个元素时:全排列为以r1开头的全排列加上以r2开头的全排列加上以r3开头的全排列,以r1开头的全排列进行分析,由于首位已经固定,所以我们可以直接考虑剩余元素{r2,r3}的全排列,然后在他们的全排列前加上r1就可以;求解{r2,r3}的全排列就可以参考集合中有两个元素时的情况,这样就可以将所有的情况递归的求解出来。
集合R中有四个元素时:同理,先分解为三个,然后两个,然后一个……

代码

public static void getPermutation(int[] array,int i,int n){
        if(i==n){
            for(int j=0;j<=n;j++){
                System.out.print(array[j]+" ");
            }
            System.out.println();
        }else{
            for(int j=i;j<=n;j++){
                int temp=array[i];
                array[i]=array[j];
                array[j]=temp;
                getPermutation(array, i+1, n);
                temp=array[i];
                array[i]=array[j];
                array[j]=temp;
            }
        }
    }

运行结果

这里写图片描述

反思

通过结果我们可以发现当数组中没有重复元素时,结果是对的,但是当数组中出现了重复元素时,结果就不正确,出现了很多重复的结果。这时候,我们可以利用set集合的元素不能重复的特性,先将结果保存在set中,然后在打印set中排列的结果。修改后的代码如下:

public static void getPermutation(int[] array,int i,int n){
        if(i==n){
            StringBuffer s=new StringBuffer();
            for(int j=0;j<=n;j++){
                s.append(array[j]+" ");
            }
            set.add(s.toString());
        }else{
            for(int j=i;j<=n;j++){
                int temp=array[i];
                array[i]=array[j];
                array[j]=temp;
                getPermutation(array, i+1, n);
                temp=array[i];
                array[i]=array[j];
                array[j]=temp;
            }
        }
    }

然后在main函数中直接输出

System.out.println(Arrays.toString(set.toArray()));

运行结果如下
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值