Java蓝桥杯——排列组合
排列组合介绍
排列,就是指从给定n个数的元素中取出指定m个数的元素,进行排序。

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

全排列(permutation)
以数字为例,全排列就是从“第一个数字”起,“每个数字”分别与它“后面的数字”交换,复杂度为O(n!)
图示:
- A依次和BC交换
- 交换一次后不急(如AB交换后,不急着交换AC),target后移,再依次交换
- 直到target=最后一个数时,停止,输出
- 返回上一步(很明显,用递归)接着做,此时注意,要把换了的数再还回来

代码:数组实现全排列
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
组合:数组实现

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
Java蓝桥杯——排列组合的更多相关文章
- Java 蓝桥杯 算法训练(VIP) 最大体积
最大体积 问题描述 每个物品有一定的体积(废话),不同的物品组合,装入背包会战用一定的总体积. 假如每个物品有无限件可用,那么有些体积是永远也装不出来的. 为了尽量装满背包,附中的OIER想要研究一下 ...
- java实现第五届蓝桥杯排列序数
排列序数 如果用a b c d这4个字母组成一个串,有4!=24种,如果把它们排个序,每个串都对应一个序号: abcd 0 abdc 1 acbd 2 acdb 3 adbc 4 adcb 5 bac ...
- JAVA蓝桥杯黄金分割数,涉及到bigdecimal
import java.math.BigDecimal; public class test { public static void main(String[] args) { BigDecimal ...
- 密码脱落 JAVA 蓝桥杯
密码脱落 X星球的考古学家发现了一批古代留下来的密码.这些密码是由A.B.C.D 四种植物的种子串成的序列.仔细分析发现,这些密码串当初应该是前后对称的(也就是我们说的镜像串).由于年代久远,其中许多 ...
- java 蓝桥杯算法提高 出现次数最多的整数
思路:其实这道题不是太难,但是这个题太坑了,提交了好多次都不是100,后来才知道,一定一定要在输入数组数据之前先判断一下输进去的n的范围,一定一定要注意,否则就是跟我下面的图片一样的效果了,泪奔~ 问 ...
- java 蓝桥杯算法提高 字串统计
思路:这道题用HashMap来保存枚举的字串,key值保存字串-value值保存字串所出现的次数: 通过for循环并使用subString()方法枚举所有符合要求的子串maxStr记录 ...
- java 蓝桥杯算法提高 矩阵乘法
思路:根据提示的内容,我们可以得到c[i][j] += a[i][k]*b[k][j],k>=0&&k<s PS:这道题本身不难,但是当我定义A[m][s] B[s][n] ...
- java 蓝桥杯算法提高 _3K好数
nums[i][j] 存的是i位数的时候,首位数字是j的K好数的数目,i从1位开始的结果,去算2位时的结果,去算3位时的结果...最后得到l位的结果.K进制只是一个范围. import java.ut ...
- java 蓝桥杯算法提高 _1区间k大数查询
import java.util.Scanner; public class _1区间K大数查询 { public static void main(String[] args) { Scanner ...
随机推荐
- BP神经网络算法程序实现鸢尾花(iris)数据集分类
作者有话说 最近学习了一下BP神经网络,写篇随笔记录一下得到的一些结果和代码,该随笔会比较简略,对一些简单的细节不加以说明. 目录 BP算法简要推导 应用实例 PYTHON代码 BP算法简要推导 该部 ...
- Java学习的第六天
1.今天学习了各种运算符, 还有选择结构,循环结构 2.今天学习没有遇到困难. 3.明天学习数组和第三章的开头一部分.
- 我用 Python 撸了一个 plist 图集拆图工具!附上github源码
这些年,我一直在使用 JavaScript .CocosCreator 做开发,只要是他们不能解决的,我都不太愿意去弄,或者说是不太情愿去做.真的是手中有把锤子,看什么都是钉子,越是熟悉一样东西,越容 ...
- 从零到千万用户,我是如何一步步优化MySQL数据库的?
写在前面 很多小伙伴留言说让我写一些工作过程中的真实案例,写些啥呢?想来想去,写一篇我在以前公司从零开始到用户超千万的数据库架构升级演变的过程吧. 本文记录了我之前初到一家创业公司,从零开始到用户超千 ...
- SQL删除语句DROP、TRUNCATE、 DELETE 的区别
主要介绍了SQL删除语句DROP.TRUNCATE. DELETE 的区别,帮助大家更好的理解和学习sql语句,感兴趣的朋友可以了解下 DROP: 1 DROP TABLE test; 删除表test ...
- 小学生学习C++应该具备哪些基础?
一.电脑操作基础: 应该具备一些必要的电脑相关的知识,如操作系统的相关知识,如何打开.编辑.保存文件.对电脑的能力有一些基本的认识,以及会使用鼠标,键盘熟练输入. 磨刀不误砍柴工,至少要做到能快速找到 ...
- php xml转数组
<?php libxml_disable_entity_loader(true); $notify_values = json_decode(json_encode(simplexml_load ...
- gcc 执行c++报错
D:\cpp>g++ hello.cc Info: resolving std::cout by linking to __imp___ZSt4cout (auto-import) c:/min ...
- VMware虚拟机 - 如何让鼠标从虚拟机中返回到个人计算机中
最简单的方式 按快捷键:ctrl+alt即可 彻底解决问题的方法:安装VMware Tools 前提条件 开启虚拟机 确认客户机操作系统正在运行 因为 VMware Tools 安装程序是使用 Per ...
- nginx优化【收藏篇】
1. 动态页返回码 2. 错误页面优化 3. 连接数优化 4.配置优化 5.日志优化 关于运维学习.分享.交流,笔者开通了微信公众号[大隆爱分享],感兴趣的朋友可以关注下,欢迎加入,建立属于我们自己的 ...