排列组合

java实现排列组合(通俗易懂)


原文地址见文末

个人感觉这篇文章(原文地址见文章尾)写的排列组合问题,非常的好,而且是一步一步引出排列组合问题,我也是看了这篇文章,一步一步按照这个思路来,最后会了自己的一套排列组合

也因此在算法竞赛中,两次用到了,成功解决了问题.


第一个问题:

  首先,先让我们来看第一个问题, 有1,2,3,4这4个数字.可以重复的在里面选4次,问能得到多少种结果.easy

  1  1  1  1

  1  1  1  2

  1  1  1  3

  1  1  1  4

  1  1  2  1

  1  1  2  2

  .......

  4  4  4  3

  4  4  4  4


  代码实现其实也很简单,大家可以看下代码,理解一下,再自己敲一下,应该可以很快敲出来


import java.util.Stack;


public class Main {


    public static Stack stack = new Stack<Integer>();

    public static void main(String[] args) {

        int shu[] = {1,2,3,4};

        f(shu,4,0);

    }

    /**

     *

     * @param shu   待选择的数组

     * @param targ  要选择多少个次

     * @param cur   当前选择的是第几次

     */

    private static void f(int[] shu, int targ, int cur) {

        // TODO Auto-generated method stub

        if(cur == targ) {

            System.out.println(stack);

            return;

        }


        for(int i=0;i<shu.length;i++) {

            stack.add(shu[i]);

            f(shu, targ, cur+1);

            stack.pop();


        }

    }


}

  输出:


[1, 1, 1, 1]

[1, 1, 1, 2]

[1, 1, 1, 3]

[1, 1, 1, 4]

[1, 1, 2, 1]

[1, 1, 2, 2]

............

............


[4, 4, 3, 2]

[4, 4, 3, 3]

[4, 4, 3, 4]

[4, 4, 4, 1]

[4, 4, 4, 2]

[4, 4, 4, 3]

[4, 4, 4, 4]

  得到了想要的结果,此处结果又很多种4*4*4*4 = 256种结果。

第二个问题:

同理,  问题来了,这时候有点排列组合的意思了 1,2,3,4排列要的到的是

1  2  3  4

1  2  4  3

1  3  4  2

1  3  2  4

......

4  2  1  2

4  3  2  1




 有没有发现要的到排列的情况,这里stack里的元素是1,2,3,4都不能重复

那么我在入栈的时候加个判断,如果比如1,已经在stack里面了,就不加进去,就不会得到  1   1  1  1 ...的情况了,就得到了排列

import java.util.Stack;


public class Main {


    public static Stack stack = new Stack<Integer>();

    public static void main(String[] args) {

        int shu[] = {1,2,3,4};

        f(shu,4,0);

    }

    /**

     *

     * @param shu   待选择的数组

     * @param targ  要选择多少个次

     * @param cur   当前选择的是第几次

     */

    private static void f(int[] shu, int targ, int cur) {

        // TODO Auto-generated method stub

        if(cur == targ) {

            System.out.println(stack);

            return;

        }


        for(int i=0;i<shu.length;i++) {

            if(!stack.contains(shu[i])) {

                stack.add(shu[i]);

                f(shu, targ, cur+1);

                stack.pop();

            }


        }

    }


}

  输出:

[1, 2, 3, 4]

[1, 2, 4, 3]

[1, 3, 2, 4]

[1, 3, 4, 2]

[1, 4, 2, 3]

[1, 4, 3, 2]

[2, 1, 3, 4]

[2, 1, 4, 3]

[2, 3, 1, 4]

[2, 3, 4, 1]

[2, 4, 1, 3]

[2, 4, 3, 1]

[3, 1, 2, 4]

[3, 1, 4, 2]

[3, 2, 1, 4]

[3, 2, 4, 1]

[3, 4, 1, 2]

[3, 4, 2, 1]

[4, 1, 2, 3]

[4, 1, 3, 2]

[4, 2, 1, 3]

[4, 2, 3, 1]

[4, 3, 1, 2]

[4, 3, 2, 1]

这就是想要的排列结果了..   4 * 3 * 2 * 1 = 24种结果。


第三个问题:

那么组合问题来了,在1,2,3,4,中选3个有多少种组合方式


1 2 3

1 2 4

1 3 4

2 3 4


共4种


import java.util.Stack;


public class Main {


    public static Stack stack = new Stack<Integer>();

    public static void main(String[] args) {

        int shu[] = {1,2,3,4};


        f(shu,3,0,0); // 从这个数组4个数中选择三个

    }


    /**

     *

     * @param shu  元素

     * @param targ  要选多少个元素

     * @param has   当前有多少个元素

     * @param cur   当前选到的下标

     *

     * 1    2   3     //开始下标到2

     * 1    2   4     //然后从3开始

     */

    private static void f(int[] shu, int targ, int has, int cur) {

        if(has == targ) {

            System.out.println(stack);

            return;

        }


        for(int i=cur;i<shu.length;i++) {

            if(!stack.contains(shu[i])) {

                stack.add(shu[i]);

                f(shu, targ, has+1, i);

                stack.pop();

            }

        }


    }

}

 输出:


[1, 2, 3]

[1, 2, 4]

[1, 3, 4]

[2, 3, 4]


https://www.cnblogs.com/zzlback/p/10947064.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容