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

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

第一个问题:

  首先,先让我们来看第一个问题, 有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实现排列组合(通俗易懂)的更多相关文章

  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. ef not in

    //not in linq var xx=(from c in measStateDetail where !((from d in breakInstr select d.InstrCode).Co ...

  2. python基础知识第九篇(函数)

    函数 >>>>>>>>>>> : 使用函数的好处 1.代码重用 2.保持一致性,方便维护 3.可扩展性 定义方法 def test01 ...

  3. [JZOJ A组]球 题解

    球(ball) [问题描述] 小 T 有 n 个桶和 2n − 1 个球,其中第 i 个桶能装前 2i − 1 个球.每个桶只能装一个球. 现在小 T 取了 m 个桶和 m 个球,并将这些球各自放在 ...

  4. CSP-S 2019 游记

    目录 CSP-S 2019 游记 DAY -1 Day 0 Day 1 Day 2 后记 CSP-S 2019 游记 机房段子: zr(老师):yyx我看你最近不错哦(此人外号拳皇 yyx:运气好运气 ...

  5. 人工智能技术导论——使用PROLOG逻辑语言解决爱因斯坦斑马文件

    一.背景 在上一篇博客https://www.cnblogs.com/wkfvawl/p/12056951.html上,我简单介绍了一下Prolog的一些基本语法,这篇博客主要通过老师课上讲过的一个问 ...

  6. 6. abp中的拦截器

    abp拦截器基本定义 拦截器接口定义: public interface IAbpInterceptor { void Intercept(IAbpMethodInvocation invocatio ...

  7. 松软科技Web课堂:JavaScript Break 和 Continue

    break 语句“跳出”循环. continue 语句“跳过”循环中的一个迭代. Break 语句 在本教程稍早的章节中,您已见到了 break 语句.它被用于“跳出” switch 语句. brea ...

  8. 生命周期感知 Lifecycle

    奉上翻译原文地址: 处理生命周期 :翻译过程中加上了自己的一点理解.理解不对的地方直接评论就好. 生命周期感知组件可以感知其他组件的生命周期,例如 Activity,Fragment等,以便于在组件的 ...

  9. linux 删除.svn文件

    linux删除当前目录及其子目录下的.svn文件,linux下删除全部的.svn文件 find . -name "*.svn" -type d -print -exec rm -r ...

  10. centos安装redis并开启多个redis实例

    1.下载安装包       下载地址 :  http://download.redis.io/releases/,去里面找对应的版本下载        例如  wget http://download ...