不使用递归求全排列和组合数
同学遇到的面试问题,大意是M台机器放在N个房间,不使用递归求打印所有情况
解题思路:情况共计N**M种。开始想将所有情况放入数组,填充好数组再逐个打印。随后发现按照填充的思路,不使用大数组也可以实现。思路是加入M=N=3,则27种情况,记i0...i26。0...M个数,0放入i0[0],i1[1],i2[2],i3[0],i4[1],i5[2]...,1放入i0[,i1,i2,
房间0 | 房间1 | 房间2 |
---|---|---|
0 1 2 | ||
1 2 | 0 | |
1 2 | 0 | |
0 2 | 1 | |
2 | 0 1 | |
2 | 1 | 0 |
0 2 | 1 | |
2 | 0 | 1 |
2 | 0 1 | |
0 1 | 2 | |
1 | 0 2 | |
1 | 2 | 0 |
0 | 1 2 | |
0 1 2 | ||
1 2 | 0 | |
0 | 2 | 1 |
0 2 | 1 | |
2 | 0 1 |
/* * 非递归打印全排列。 */
public class Permutations { static void swap(char[] s, int i, int j) { char c = s[i]; s[i] = s[j]; s[j] = c; } static void fullPermutation(char[] s) { for (int i = 0; i < s.length; i++) { for (int j = 1; j < s.length; j++) { swap(s, j, j - 1); System.out.println(s); } } } public static void main(String[] args) { fullPermutation("1234".toCharArray()); }
}
类似的问题非递归打印组合数。例如Cmn。建立长度为m的数组,前n个置为1。从左到右扫描数组元素值的10组合,找到第一个10组合后将其变为01并将其左边的1移动到最左端。
/* * 非递归打印组合数 */
public class Combinations { static void swap(int[] a, int i, int j) { int t = a[i]; a[i] = a[j]; a[j] = t; } static void print(char[] s, int[] t) { for (int i = 0; i < t.length; i++) { if (t[i] == 1) System.out.print(s[i] + " "); } System.out.println(); } public static void combinations(char[] s, int n) { int[] t = new int[s.length]; int m = t.length; for (int i = 0; i < n; i++) t[i] = 1; print(s, t); while (true) { int i; for (i = 1; i < m; i++) { if (t[i] == 0 && t[i - 1] == 1) { swap(t, i, i - 1); int p = -1; for (int j = 0; j < i - 1; j++) { if (t[j] == 1) { swap(t, ++p, j); } } print(s, t); break; } } if (i == m) { return; } } } public static void main(String[] args) { char[] s = "12345".toCharArray(); combinations(s, 2); }
}
不使用递归求全排列和组合数相关推荐
- Java递归求全排列详解
Java递归求全排列详解 推荐博客: 博客园Java全排列递归算法,结尾的解释很形象了 csdn的大佬写的,和我下面的代码思路基本一致 全排列的递归思想解释: 全排列的数学定义就不再过多解释,考虑递归 ...
- 递归求全排列的学习与理解
递归求全排列 全排列: 从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列.当m=n时所有的排列情况叫全排列. 例题: 输出自然数 1 到n所有 ...
- 递归 求全排列与全组合
我在百度,触宝面试的时候,他们都问到了递归. 递归是一个很有意思的问题,其中的经典问题有汉诺塔,fibonacci 数列问题.汉诺塔是比较难的问题,fibonacci 是比较简单的问题. 触宝面试的时 ...
- 三种求全排列方式之比较
一共有三种求全排列的方式: 第一种就是只适合用于非可重集的DFS实现 第二种就是可以用于可重集上的刘汝佳书上的代码 第三种就是STL中的next--permutation 在对这三种方式做了比较之后发 ...
- 蓝桥杯笔记:(给的元素不重复)求全排列(排列不可重复,排列可重复)
1.各个元素不重复 abc,acb,....... 用next_permutataion()求全排列 #include<iostream> #include<algorithm> ...
- C++ STL求全排列和组合
C++11 STL内置了求全排列的模板函数next_permutation和prev_permutation,属于<algorithm>头文件和std命名空间,使用非常方便.例如: vec ...
- 《算法竞赛进阶指南》打卡-基本算法-AcWing 94. 递归实现排列型枚举:dfs、二进制状态压缩
文章目录 题目解答 题目来源 题目解答 分析: dfs求全排列,这里是用二进制状态压缩进行优化,二进制状态压缩,顾名思义,每个状态是用二进制的某一位表示.这里的体现是state这个状态,它的每一位代表 ...
- PermutationsUnique,求全排列,去重
问题描述:给定一个数组,数组里面有重复元素,求全排列. 算法分析:和上一道题一样,只不过要去重. 3 import java.util.ArrayList; 4 import java.util.Ha ...
- python关于递归求组合与组合数-通过阶乘, fibonacci加深对递归的理解
python关于递归求组合与组合数: 首先需要找到递归的突破口. 要求如下: Exercise 3: Enumerating Combinations You need to write a func ...
最新文章
- TiKV 成功晋级 CNCF 孵化项目
- 再次分享一个多选文件上传方案“.NET研究”
- count_sort计数排序OpenMP的并行化
- 第四课-程序的循环结构
- 直接通过ADO操作Access数据库(修改版)
- 两数据库Dblink数据抽取blob
- SI和DI寄存器(0703)
- dbf如何导入oracle_克服Oracle导数一切难题
- 再看《JavaScript高级程序设计》第8-9章
- php 时间戳 24小时制,如何在php中添加24小时的unix时间戳?(How do I add 24 hours to a unix timestamp in php?)...
- php通用查询系统excel,php+excel通用课表查询系统
- 阵列信号处理学习小结
- xcode 可以打开xmind_思维导图,原来Xmind这么强大
- 时间序列之向量自回归检验VAR(自相关性)(2)
- 图像处理算法之模糊检测
- chrome浏览器去除蓝色边框和黄色背景色
- 近岸蛋白递交注册:年营收3.4亿 朱化星控制71.24%表决权
- strawberry perl环境安装介绍
- (附源码)计算机毕业设计SSM基于web的网上订餐系统
- 灵魂拷问:Java的可变参数究竟是怎么一回事?
热门文章
- 第二代NumPy?阿里开源超大规模矩阵计算框架Mars
- 福利丨一门面向所有人的人工智能公开课:MIT 6.S191,深度学习入门
- (如何从一个列表中随机抽样)np.random.choice(),random.sample()
- visual studio code(vs code)如何更换颜色背景
- 诺奖10年,干细胞领域再突破!华大单细胞技术助力获得人类体外诱导全能干细胞...
- 世界首富太空争霸:从地上斗到天上,马斯克VS贝索斯,谁能赢
- MEMS传感器的未来在哪?
- 今年的谷歌I/O大会,或许会有这些东西
- 斯坦福大学陈丹琦等人解读机器阅读最新进展:超越局部模式匹配
- 工业互联网平台创新发展白皮书(2018)