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

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

第一个问题:

  首先,先让我们来看第一个问题, 有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

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

  1. import java.util.Stack;
  2.  
  3. public class Main {
  4.  
  5. public static Stack<Integer> stack = new Stack<Integer>();
  6. public static void main(String[] args) {
  7. int shu[] = {1,2,3,4};
  8. f(shu,4,0);
  9. }
  10. /**
  11. *
  12. * @param shu 待选择的数组
  13. * @param targ 要选择多少个次
  14. * @param cur 当前选择的是第几次
  15. */
  16. private static void f(int[] shu, int targ, int cur) {
  17. // TODO Auto-generated method stub
  18. if(cur == targ) {
  19. System.out.println(stack);
  20. return;
  21. }
  22.  
  23. for(int i=0;i<shu.length;i++) {
  24. stack.add(shu[i]);
  25. f(shu, targ, cur+1);
  26. stack.pop();
  27.  
  28. }
  29. }
  30.  
  31. }

  输出:

  1. [1, 1, 1, 1]
  2. [1, 1, 1, 2]
  3. [1, 1, 1, 3]
  4. [1, 1, 1, 4]
  5. [1, 1, 2, 1]
  6. [1, 1, 2, 2]
  7. ............
  8. ............
  9.  
  10. [4, 4, 3, 2]
  11. [4, 4, 3, 3]
  12. [4, 4, 3, 4]
  13. [4, 4, 4, 1]
  14. [4, 4, 4, 2]
  15. [4, 4, 4, 3]
  16. [4, 4, 4, 4]

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

第二个问题:

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

  1. 1  2  3  4
  2. 1  2  4  3
  3. 1  3  4  2
  4. 1  3  2  4
  5. ......
  6. 4  2  1  2
  7. 4  3  2  1

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

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

  1. import java.util.Stack;
  2.  
  3. public class Main {
  4.  
  5. public static Stack<Integer> stack = new Stack<Integer>();
  6. public static void main(String[] args) {
  7. int shu[] = {1,2,3,4};
  8. f(shu,4,0);
  9. }
  10. /**
  11. *
  12. * @param shu 待选择的数组
  13. * @param targ 要选择多少个次
  14. * @param cur 当前选择的是第几次
  15. */
  16. private static void f(int[] shu, int targ, int cur) {
  17. // TODO Auto-generated method stub
  18. if(cur == targ) {
  19. System.out.println(stack);
  20. return;
  21. }
  22.  
  23. for(int i=0;i<shu.length;i++) {
  24. if(!stack.contains(shu[i])) {
  25. stack.add(shu[i]);
  26. f(shu, targ, cur+1);
  27. stack.pop();
  28. }
  29.  
  30. }
  31. }
  32.  
  33. }

  输出:

  1. [1, 2, 3, 4]
  2. [1, 2, 4, 3]
  3. [1, 3, 2, 4]
  4. [1, 3, 4, 2]
  5. [1, 4, 2, 3]
  6. [1, 4, 3, 2]
  7. [2, 1, 3, 4]
  8. [2, 1, 4, 3]
  9. [2, 3, 1, 4]
  10. [2, 3, 4, 1]
  11. [2, 4, 1, 3]
  12. [2, 4, 3, 1]
  13. [3, 1, 2, 4]
  14. [3, 1, 4, 2]
  15. [3, 2, 1, 4]
  16. [3, 2, 4, 1]
  17. [3, 4, 1, 2]
  18. [3, 4, 2, 1]
  19. [4, 1, 2, 3]
  20. [4, 1, 3, 2]
  21. [4, 2, 1, 3]
  22. [4, 2, 3, 1]
  23. [4, 3, 1, 2]
  24. [4, 3, 2, 1]

  

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

第三个问题:

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

  1. 1 2 3
  2. 1 2 4
  3. 1 3 4
  4. 2 3 4
  5.  
  6. 4
  1. import java.util.Stack;
  2.  
  3. public class Main {
  4.  
  5. public static Stack<Integer> stack = new Stack<Integer>();
  6. public static void main(String[] args) {
  7. int shu[] = {1,2,3,4};
  8.  
  9. f(shu,3,0,0); // 从这个数组4个数中选择三个
  10. }
  11.  
  12. /**
  13. *
  14. * @param shu 元素
  15. * @param targ 要选多少个元素
  16. * @param has 当前有多少个元素
  17. * @param cur 当前选到的下标
  18. *
  19. * 1 2 3 //开始下标到2
  20. * 1 2 4 //然后从3开始
  21. */
  22. private static void f(int[] shu, int targ, int has, int cur) {
  23. if(has == targ) {
  24. System.out.println(stack);
  25. return;
  26. }
  27.  
  28. for(int i=cur;i<shu.length;i++) {
  29. if(!stack.contains(shu[i])) {
  30. stack.add(shu[i]);
  31. f(shu, targ, has+1, i);
  32. stack.pop();
  33. }
  34. }
  35.  
  36. }
  37. }

输出:

  1. [1, 2, 3]
  2. [1, 2, 4]
  3. [1, 3, 4]
  4. [2, 3, 4]

原文地址:  https://blog.csdn.net/Ring_k/article/details/79575533

java实现排列组合(通俗易懂)的更多相关文章

  1. Java蓝桥杯——排列组合

    排列组合介绍 排列,就是指从给定n个数的元素中取出指定m个数的元素,进行排序. 组合,则是指从给定n个数的元素中仅仅取出指定m个数的元素,不考虑排序. 全排列(permutation) 以数字为例,全 ...

  2. HDU 4045 Machine scheduling (组合数学-斯特林数,组合数学-排列组合)

    Machine scheduling Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  3. 排列组合[HDU1521]

    排列组合 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  4. Java字符串排列算法

    Java字符串排列算法 题目:现有ABCDE 5个球 构成的排列组合 可重复抽取 最多取到16个 共有多少种组合方式? 比如:取1个球可以构成的组合有 A B C D E 共5种,取2个球可以构成的组 ...

  5. java-算法-排列组合

    package com.qinghuainvest.utils.algorithm; import java.util.ArrayList; import java.util.Arrays; impo ...

  6. 数组排列组合问题——BACKTRACKING

    BACKTRACKING backtracking(回溯法)是一类递归算法,通常用于解决某类问题:要求找出答案空间中符合某种特定要求的答案,比如eight queens puzzle(将国际象棋的八个 ...

  7. 给定数组a[1,2,3],用a里面的元素来生成一个长度为5的数组,打印出其排列组合

    给定数组a[1,2,3],用a里面的元素来生成一个长度为5的数组,打印出其排列组合 ruby代码: def all_possible_arr arr, length = 5 ret = [] leng ...

  8. LeetCode 77 Combinations(排列组合)

    题目链接:https://leetcode.com/problems/combinations/#/description    Problem:给两个正数分别为n和k,求出从1,2.......n这 ...

  9. hdu 4451 Dressing 排列组合/水题

    Dressing Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

随机推荐

  1. 如何成为一名成功的iOS程序员,挑战年薪50万?

    编程是一个仅靠兴趣仍不足以抵达成功彼岸的领域.你必须充满激情,并且持之以恒地不断汲取更多有关编程的知识.只是对编程感兴趣还不足以功成名就——众所周知,我们工作起来像疯子. 编程是一个没有极限的职业,所 ...

  2. Jenkins编译过程中出现ERROR_ Failed to parse POMs错误

    一.在使用jenkins编写过程中突然出现以下问题 Parsing POMs Established TCP socket on 59407 [java] $ java -cp /var/lib/je ...

  3. forEach()和for/in循环的缺点与for-of循环

    以数组为例,JavaScript 提供多种遍历语法.最原始的写法就是for循环. for (var index = 0; index < myArray.length; index++) { c ...

  4. 【consul】使用学习

    [consul]使用学习 转载:https://www.cnblogs.com/yangchongxing/p/10653791.html 1.下载 consul https://www.consul ...

  5. 【Maven】plugin使用学习

    Maven plugin使用学习 官网可用的插件:http://maven.apache.org/plugins/index.html 目录 ============================= ...

  6. 35个Java代码优化的细节,你知道几个?

    前言 代码 优化 ,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗?没 ...

  7. HttpRunner学习9--切换测试报告模板

    前言 在HttpRunner中,给我们提供了 2 套测试报告模板,分别是 default_report_template.html 和 extent_report_template.html . 默认 ...

  8. Winform中实现向窗体中拖放照片并显示以及拖放文件夹显示树形结构(附代码下载)

    场景 向窗体中拖拽照片并显示效果 向窗体中拖拽文件夹并显示树形结构效果 注: 博客主页: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的程序猿 ...

  9. 学习SQL注入---1

    开始接触SQL注入了,最开始根据网上的思路做了两道注入的题,但对于SQL注入如何实现,怎么一个流程还是不理解.后来,在网上查找了很多资料,现在一点点去理解. 1.利用sqlmap注入的时候,不是所有页 ...

  10. 元类, pymysql

    元类, pymysql 一.元类 自定义元类 ''' 1.什么是元类? - 类的类就是type,其实type就是元类 2.元类的作用? 3.如何创建元类以及使用? ''' # # 1.一切皆对象 # ...