当前位置: 首页 > news >正文

Java蓝桥杯——排列组合

排列组合介绍

排列,就是指从给定n个数的元素中取出指定m个数的元素,进行排序。

排列

组合,则是指从给定n个数的元素中仅仅取出指定m个数的元素,不考虑排序。

组合

全排列(permutation)

以数字为例,全排列就是从“第一个数字”起,“每个数字”分别与它“后面的数字”交换,复杂度为O(n!)

图示:

  1. A依次和BC交换
  2. 交换一次后不急(如AB交换后,不急着交换AC),target后移,再依次交换
  3. 直到target=最后一个数时,停止,输出
  4. 返回上一步(很明显,用递归)接着做,此时注意,要把换了的数再还回来

全排列

代码:数组实现全排列

package hulaoshi.permutation;
public class Common {
    static void swap(char str[], int a, int b) {
        if (a == b) {
            return;
        }
        char temp = str[a];
        str[a] = str[b];
        str[b] = temp;
    }
    static void printArr(char str[]) {
        for (char c : str) {
            System.out.print(c + " ");
        }
        System.out.println();
    }
}
package hulaoshi.permutation;
public class 全排列 {
    static int count = 0;
    static void permutation(char str[], int t) {
        if (t == str.length - 1) {
            // 3.停止
            System.out.print(++count + ": ");
            Common.printArr(str);
            return;
        }
        for (int i = t; i < str.length; i++) {
            Common.swap(str, t, i);
            // 2.递归
            permutation(str, t + 1);
            // 4.返回上层,换回来
            Common.swap(str, t, i);
        }
    }
    public static void main(String[] args) {
        char str[] = new String("ABC").toCharArray();
        // 1.从0开始
        permutation(str, 0);
    }
}

结果:

1: A B C 
2: A C B 
3: B A C 
4: B C A 
5: C B A 
6: C A B 

组合:数组实现

1648799-20190715195333789-1587398841.png

package hulaoshi.permutation;
public class 组合 {
    static char[] _original = "ABCDE".toCharArray();
    static int N = _original.length;
    static int M = 3;
    static int[] _indexArr = new int[M];
    static void C(int n, int m) {
        // 1.以5取3为例,n=5,m=3,遍历下标【2~4】,取第3个元素【m-1】
        for (int i = m - 1; i <= n - 1; i++) {
            // 2.下标存入
            _indexArr[m - 1] = i;
            if (m == 1) {
                printArr();
                // 4.不要return,循环还要继续
                continue;
            }
            // 3.剩下的递归,剩下i个元素,取m-1个
            C(i, m - 1);
        }
    }
    static void printArr() {
        for (int i : _indexArr) {
            System.out.print(_original[i]);
        }
        System.out.println();
    }
    public static void main(String[] args) {
        C(N, M);
    }
}

结果:

ABC
ABD
ACD
BCD
ABE
ACE
BCE
ADE
BDE
CDE

排列:列表实现

就是一个数字一个数字地扫,为避免递归时,已经确定的数还回(如数组实现全排列时的两个swap,每次递归时创建一个新的ArrayList)

package hulaoshi.permutation;
import java.util.ArrayList;
public class 排列组合2 {
    static char[] _原序列 = "ABC".toCharArray();
    static int total;
    static int n = _原序列.length;
    static int m = 2;
    static void printArray(ArrayList<Integer> lstIdx) {
        for (Integer i : lstIdx) {
            System.out.print(_原序列[i]);
        }
        System.out.println();
    }
    static void A(int m, ArrayList<Integer> lstIdx) {
        if (m == 0) {
            // 递归完毕,打印出来
            printArray(lstIdx);
            total++;
            return;
        }
        for (int i = 0; i < n; i++) {
            // 上一次调用本方法时的ArrayList,不改
            // 创建新的ArrayList,为的是递归完毕时,旧的ArrayList不变
            ArrayList<Integer> lstIdx2 = new ArrayList<Integer>();
            lstIdx2.addAll(lstIdx);
            if (!lstIdx.contains(i)) {
                lstIdx2.add(i);
                // 递归调用,将ArrayList传进去,但函数内会生成新的,把这个完全包含
                A(m - 1, lstIdx2);
            }
        }
    }
    public static void main(String[] args) {
        A(m, new ArrayList<Integer>());
        System.out.println("total : " + total);
    }
}

结果:

AB
AC
BA
BC
CA
CB
total : 6

转载于:https://www.cnblogs.com/tigerlion/p/11191064.html

相关文章:

  • 经典bug集锦
  • javassit(1) 基础概念
  • unity中Playable的使用
  • 设计已死?
  • 镜花缘——李汝珍著
  • 破译肢体语言密码——王邈著
  • 探寻胡适的精神世界——欧阳哲生著
  • 新开通一个英文博客
  • 大宋国士——陈启文著
  • 爸爸是只“狗”——王小列著
  • 从项目中清楚ClickOnce
  • 极限运算法则
  • [VS2005 Tip] 自动生成Property。
  • 函数的连续性
  • 心态造就一生——张现杰著
  • 分享的文章《人生如棋》
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • Angular 响应式表单之下拉框
  • CentOS7简单部署NFS
  • Js基础知识(四) - js运行原理与机制
  • js写一个简单的选项卡
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • node入门
  • Web设计流程优化:网页效果图设计新思路
  • 闭包,sync使用细节
  • 从伪并行的 Python 多线程说起
  • 类orAPI - 收藏集 - 掘金
  • 异常机制详解
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • 关于Android全面屏虚拟导航栏的适配总结
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • 直播平台建设千万不要忘记流媒体服务器的存在 ...
  • ​人工智能书单(数学基础篇)
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • #100天计划# 2013年9月29日
  • #pragma multi_compile #pragma shader_feature
  • #Z0458. 树的中心2
  • $jQuery 重写Alert样式方法
  • (2.2w字)前端单元测试之Jest详解篇
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (二)c52学习之旅-简单了解单片机
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • (译)计算距离、方位和更多经纬度之间的点
  • (轉貼) UML中文FAQ (OO) (UML)
  • . Flume面试题
  • .describe() python_Python-Win32com-Excel
  • .NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(准备篇)
  • .NET Core中Emit的使用
  • .NET Micro Framework 4.2 beta 源码探析
  • .net反混淆脱壳工具de4dot的使用