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<Integer> 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<Integer> 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<Integer> 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://blog.csdn.net/Ring_k/article/details/79575533
java实现排列组合(通俗易懂)的更多相关文章
- Java蓝桥杯——排列组合
排列组合介绍 排列,就是指从给定n个数的元素中取出指定m个数的元素,进行排序. 组合,则是指从给定n个数的元素中仅仅取出指定m个数的元素,不考虑排序. 全排列(permutation) 以数字为例,全 ...
- HDU 4045 Machine scheduling (组合数学-斯特林数,组合数学-排列组合)
Machine scheduling Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- 排列组合[HDU1521]
排列组合 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- Java字符串排列算法
Java字符串排列算法 题目:现有ABCDE 5个球 构成的排列组合 可重复抽取 最多取到16个 共有多少种组合方式? 比如:取1个球可以构成的组合有 A B C D E 共5种,取2个球可以构成的组 ...
- java-算法-排列组合
package com.qinghuainvest.utils.algorithm; import java.util.ArrayList; import java.util.Arrays; impo ...
- 数组排列组合问题——BACKTRACKING
BACKTRACKING backtracking(回溯法)是一类递归算法,通常用于解决某类问题:要求找出答案空间中符合某种特定要求的答案,比如eight queens puzzle(将国际象棋的八个 ...
- 给定数组a[1,2,3],用a里面的元素来生成一个长度为5的数组,打印出其排列组合
给定数组a[1,2,3],用a里面的元素来生成一个长度为5的数组,打印出其排列组合 ruby代码: def all_possible_arr arr, length = 5 ret = [] leng ...
- LeetCode 77 Combinations(排列组合)
题目链接:https://leetcode.com/problems/combinations/#/description Problem:给两个正数分别为n和k,求出从1,2.......n这 ...
- hdu 4451 Dressing 排列组合/水题
Dressing Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Subm ...
随机推荐
- 如何成为一名成功的iOS程序员,挑战年薪50万?
编程是一个仅靠兴趣仍不足以抵达成功彼岸的领域.你必须充满激情,并且持之以恒地不断汲取更多有关编程的知识.只是对编程感兴趣还不足以功成名就——众所周知,我们工作起来像疯子. 编程是一个没有极限的职业,所 ...
- Jenkins编译过程中出现ERROR_ Failed to parse POMs错误
一.在使用jenkins编写过程中突然出现以下问题 Parsing POMs Established TCP socket on 59407 [java] $ java -cp /var/lib/je ...
- forEach()和for/in循环的缺点与for-of循环
以数组为例,JavaScript 提供多种遍历语法.最原始的写法就是for循环. for (var index = 0; index < myArray.length; index++) { c ...
- 【consul】使用学习
[consul]使用学习 转载:https://www.cnblogs.com/yangchongxing/p/10653791.html 1.下载 consul https://www.consul ...
- 【Maven】plugin使用学习
Maven plugin使用学习 官网可用的插件:http://maven.apache.org/plugins/index.html 目录 ============================= ...
- 35个Java代码优化的细节,你知道几个?
前言 代码 优化 ,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗?没 ...
- HttpRunner学习9--切换测试报告模板
前言 在HttpRunner中,给我们提供了 2 套测试报告模板,分别是 default_report_template.html 和 extent_report_template.html . 默认 ...
- Winform中实现向窗体中拖放照片并显示以及拖放文件夹显示树形结构(附代码下载)
场景 向窗体中拖拽照片并显示效果 向窗体中拖拽文件夹并显示树形结构效果 注: 博客主页: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的程序猿 ...
- 学习SQL注入---1
开始接触SQL注入了,最开始根据网上的思路做了两道注入的题,但对于SQL注入如何实现,怎么一个流程还是不理解.后来,在网上查找了很多资料,现在一点点去理解. 1.利用sqlmap注入的时候,不是所有页 ...
- 元类, pymysql
元类, pymysql 一.元类 自定义元类 ''' 1.什么是元类? - 类的类就是type,其实type就是元类 2.元类的作用? 3.如何创建元类以及使用? ''' # # 1.一切皆对象 # ...