关于各种排列组合java算法实现方法

2016-02-19 09:05 7 1 收藏

最近很多朋友喜欢上设计,但是大家却不知道如何去做,别担心有图老师给你解答,史上最全最棒的详细解说让你一看就懂。

【 tulaoshi.com - 编程语言 】

一.利用二进制状态法求排列组合,此种方法比较容易懂,但是运行效率不高,小数据排列组合可以使用
代码如下:

import java.util.Arrays;

//利用二进制算法进行全排列
//count1:170187
//count2:291656

public class test {
    public static void main(String[] args) {
        long start=System.currentTimeMillis();
        count2();
        long end=System.currentTimeMillis();
        System.out.println(end-start);
    }
    private static void count2(){
        int[] num=new int []{1,2,3,4,5,6,7,8,9};
        for(int i=1;iMath.pow(9, 9);i++){
            String str=Integer.toString(i,9);
            int sz=str.length();
            for(int j=0;j9-sz;j++){
                str="0"+str;
            }
            char[] temp=str.toCharArray();
            Arrays.sort(temp);
            String gl=new String(temp);
            if(!gl.equals("012345678")){
                continue;
            }
            String result="";
            for(int m=0;mstr.length();m++){
                result+=num[Integer.parseInt(str.charAt(m)+"")];
            }
            System.out.println(result);
        }
    }
    public static void count1(){
        int[] num=new int []{1,2,3,4,5,6,7,8,9};
        int[] ss=new int []{0,1,2,3,4,5,6,7,8};
        int[] temp=new int[9];
        while(temp[0]9){
            temp[temp.length-1]++;
            for(int i=temp.length-1;i0;i--){
                if(temp[i]==9){
                    temp[i]=0;
                    temp[i-1]++;
                }
            }
            int []tt=temp.clone();
            Arrays.sort(tt);
            if(!Arrays.equals(tt,ss)){
                continue;
            }
            String result="";
            for(int i=0;inum.length;i++){
                result+=num[temp[i]];
            }
            System.out.println(result);

        }
    }
}

二.用递归的思想来求排列跟组合,代码量比较大
代码如下:

package practice;

import java.util.ArrayList;
import java.util.List;

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

public class Test1 {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Object[] tmp={1,2,3,4,5,6};
//        ArrayListObject[] rs=RandomC(tmp);
        ArrayListObject[] rs=cmn(tmp,3);
        for(int i=0;irs.size();i++)
        {
//            System.out.print(i+"=");
            for(int j=0;jrs.get(i).length;j++)
            {
                System.out.print(rs.get(i)[j]+",");
            }
            System.out.println();

        }
    }

   
    // 求一个数组的任意组合
    static ArrayListObject[] RandomC(Object[] source)
    {
        ArrayListObject[] result=new ArrayListObject[]();
        if(source.length==1)
        {
            result.add(source);       
        }
        else
        {
            Object[] psource=new Object[source.length-1];
            for(int i=0;ipsource.length;i++)
            {
                psource[i]=source[i];
            }
            result=RandomC(psource);
            int len=result.size();//fn组合的长度
            result.add((new Object[]{source[source.length-1]}));
            for(int i=0;ilen;i++)
            {
                Object[] tmp=new Object[result.get(i).length+1];
                for(int j=0;jtmp.length-1;j++)
                {
                    tmp[j]=result.get(i)[j];
                }
                tmp[tmp.length-1]=source[source.length-1];
                result.add(tmp);
            }

        }
        return result;
    }

    static ArrayListObject[] cmn(Object[] source,int n)
    {
        ArrayListObject[] result=new ArrayListObject[]();
        if(n==1)
        {
            for(int i=0;isource.length;i++)
            {
                result.add(new Object[]{source[i]});

            }
        }
        else if(source.length==n)
        {
            result.add(source);
        }
        else
        {
            Object[] psource=new Object[source.length-1];
            for(int i=0;ipsource.length;i++)
            {
                psource[i]=source[i];
            }
            result=cmn(psource,n);
            ArrayListObject[] tmp=cmn(psource,n-1);
            for(int i=0;itmp.size();i++)
            {
                Object[] rs=new Object[n];
                for(int j=0;jn-1;j++)
                {
                    rs[j]=tmp.get(i)[j];
                }
                rs[n-1]=source[source.length-1];
                result.add(rs);
            }
        }
        return result;
    }

}

三.利用动态规划的思想求排列和组合
代码如下:

package Acm;
//强大的求组合数
public class MainApp {
    public static void main(String[] args) {
        int[] num=new int[]{1,2,3,4,5};
        String str="";
        //求3个数的组合个数
//        count(0,str,num,3);
//        求1-n个数的组合个数
        count1(0,str,num);
    }

    private static void count1(int i, String str, int[] num) {
        if(i==num.length){
            System.out.println(str);
            return;
        }
        count1(i+1,str,num);
        count1(i+1,str+num[i]+",",num);
    }

    private static void count(int i, String str, int[] num,int n) {
        if(n==0){
            System.out.println(str);
            return;
        }
        if(i==num.length){
            return;
        }
        count(i+1,str+num[i]+",",num,n-1);
        count(i+1,str,num,n);
    }
}

下面是求排列
代码如下:

package Acm;
//求排列,求各种排列或组合后排列
import java.util.Arrays;
import java.util.Scanner;

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

public class Demo19 {
    private static boolean f[];
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int sz=sc.nextInt();
        for(int i=0;isz;i++){
            int sum=sc.nextInt();
            f=new boolean[sum];
            Arrays.fill(f, true);
            int[] num=new int[sum];
            for(int j=0;jsum;j++){
                num[j]=j+1;
            }
            int nn=sc.nextInt();
            String str="";
            count(num,str,nn);
        }
    }
    /**
     *
     * @param num 表示要排列的数组
     * @param str 以排列好的字符串
     * @param nn  剩下需要排列的个数,如果需要全排列,则nn为数组长度
     */
    private static void count(int[] num, String str, int nn) {
        if(nn==0){
            System.out.println(str);
            return;
        }
        for(int i=0;inum.length;i++){
            if(!f[i]){
                continue;
            }
            f[i]=false;
            count(num,str+num[i],nn-1);
            f[i]=true;
        }
    }
}

来源:https://www.tulaoshi.com/n/20160219/1589473.html

延伸阅读
题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不 死,问每个月的兔子总数为多少? 1.程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21.... public class exp2{ public static void main(String args[]){ int i=0; for(i=1;i=20;i++) System.out.println(f(i)); }public ...
标签: Web开发
首先给扑克牌中每张牌设定一个编号,下面算法实现的编号规则如下: u 红桃按照从小到大依次为:1-13 u 方块按照从小到大依次为:14-26 u 黑桃按照从小到大依次为:27-39 u 梅花按照从小到大依次为:40-52 u 小王为53,大王为54 算法实现如下: u 首先按照以上编号规则初始化一个包含108个数字的数组 u 每次随机从该数组中抽取一个数字,...
添加要签名的信息 public final byte[] sign() throws SignatureException 返回签名的数组,前提是initSign和update public final void initVerify(PublicKey publicKey) throws InvalidKeyException 用指定的公钥初始化 参数:publicKey 验证时用的公钥 public final boolean verify(byte[]...
        第1章 基础知识 1.1. 单钥密码体制 单钥密码体制是一种传统的加密算法,是指信息的发送方和接收方共同使用同一把密钥进行加解密。 通常,使用的加密算法 比较简便高效,密钥简短,加解密速度快,破译极其困难。但是加密的安全性依靠密钥保管的安全性,在公开的计算机网络上安...
在城市智能交通中,经常会用到最短路径的问题,比如找最佳的行车路线等,Dijkstra算法做为最经典的求解方法,为我们指明了方向.不过真正想让我了解该算法的原因是在学习ICTCLAS的N-最短路径算法,虽然和我们常用的案例有一点区别,但基本相同,为了更好的理解N-最短路径算法,我又重新把大学时代的数据结构知识搬了出来。 在网上找到一篇文章...

经验教程

653

收藏

73
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部