Java之数组的全排列

1.算法思想

例如求[1,2,3,4]的全排列

  • 首先需要循环4次,目的是分别得到以1,2,3,4为首的数组
  • 如循环第一次,先取出1,然后将剩下的3个数再进行全排列,即再循环3次,分别取出以2,3,4位首的数组......一直到最后一个数取出
  • 相对外层循环结束之后,需要还原循环语句执行之前的数组,以便下次进行全排列
package cn.tedu.basic;

import java.util.Arrays;
import java.util.Scanner;
import java.util.Stack;

public class test1 {
    public static boolean check(int a[]){
//        if(a[1]>a[0]&&a[3]>a[0]&&a[2]>a[1]&&a[4]>a[1]&&a[4]>a[3]&&a[5]>a[4]&&a[5]>a[2]){
//            return true;
//        }
        if(a[1]>a[0]&&a[2]>a[0]&&a[3]>a[1]&&a[3]>a[2]){
            return true;
        }
        return false;
    }
    public static void perm(int[] array, Stack<Integer> stack) {//利用循环递归,将数据存入栈中
        if (array.length <= 0) {    //创造递归结束条件
            //进入了叶子节点,输出栈中内容
            Stack<Integer> stackcopy = (Stack<Integer>) stack.clone();  //克隆一个栈stackcopy,用于对栈进行相关操作,而不改变原栈内容
            int length = stack.size();
            int a[] = new int[length];      //定义一个长度为栈的长度的数组,用于存储栈的内容
            for (int j = 0; j < length; j++) {
                a[j] = stackcopy.peek();    //先取出栈顶元素到数组
                stackcopy.pop();            //然后将栈顶元素出栈
            }
            if (check(a)) {                 //判断数组是否满足条件
                System.out.println(Arrays.toString(a));//该数组满足条件,打印输出满足条件的数组
            }
        }
        else {
            for (int i = 0; i < array.length; i++) {    //后续就是tempArray.length
                //tmepArray是一个临时数组
                //例如:1,2,3的全排列,先取出1,那么这时tempArray中就是2,3
                int[] tempArray = new int[array.length-1];//以a[i]为界线,tempArray存储a[i+1]~a[array.length-1]的数据
                System.arraycopy(array,0,tempArray,0,i);
                System.arraycopy(array,i+1,tempArray,i,array.length-i-1);
                stack.push(array[i]);//1;array[i]依次入栈
                perm(tempArray,stack);  //递归,tempArray相对于array            
                stack.pop();        //栈顶元素出栈,还原array数组,以便进行下一次循环的操作


            }
        }
    }
    public static void main(String[] args) {
        int p[]={1,2,3,4};
        perm(p,new Stack<>());
    }
}
//输出要求:a[1]>a[0]&&a[2]>a[0]&&a[3]>a[1]&&a[3]>a[2]
结果显示:
[1, 3, 2, 4]
[1, 2, 3, 4]

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值