java全排列

java全排列

全排列公式: 定义perm(R)是集合R的全排列,全排列即为i,perm(Ri) Ri为除了i的其他元素集合
思想: 从每个待排列组合中进行dfs,将搜索到的元素进行入栈(回溯),直到待排列的元素为0即全都入栈了那么打印栈即为一种可能排列,然后逐个出栈继续执行for循环即进行回溯操作。
递归出口:数组元素为0个。

/**
 * @description: 定义perm(R)是集合R的全排列,全排列即为i,perm(Ri) Ri为除了i的其他元素集合
 * @author: 司云航
 * @create: 2020-07-17 08:30
 */
public class QuanPaiLie {
        public static void main(String[] args) {
            perm(new int[]{1,2,3},new Stack<>());
        }
        public static void perm(int[] array, Stack<Integer> stack) {
            if(array.length <= 0) {
                //进入了叶子节点,输出栈中内容
                System.out.println(stack);
            } else {
                for (int i = 0; i < array.length; i++) { // 循环找一个开头的,每一个元素都有可能开头
                    //tmepArray是一个临时数组,用于就是Ri
                    //eg:1,2,3的全排列,先取出1,那么这时tempArray中就是2,3
                    int[] tempArray = new int[array.length-1];
                    // 下面两行为复制数组,除了array[i]不复制其他都复制
                    System.arraycopy(array,0,tempArray,0,i);
                    System.arraycopy(array,i+1,tempArray,i,array.length-i-1);
                    // 开头元素进栈
                    stack.push(array[i]);
                    // 递归进栈,直到叶子节点也进栈即传进去的数组是空数组时开始递归执行下面的pop语句
                    perm(tempArray,stack);
                    stack.pop();
                }
            }
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值