最近因为算法考试,一直就是有空闲了刷刷题。
刷的题多了,也就发现很多基础算法在一些较复杂的题中都有应用,比如这篇文章中将要提到的排列和组合。
排列
排列,一般地,从m个不同元素中取出n(n≤m)个元素,按照一定的顺序排成一列,叫做从m个元素中取出n个元素的一个排列(permutation)。
组合
组合,一般地,从m个不同的元素中,任取n(n≤m)个元素为一组,叫作从m个不同元素中取出n个元素的一个组合。
区别
以上两个概念在高中数学中就学习,此处就不过多的阐述。 唯一强调一下二者的差异,排列是有序的,组合是无序的
代码实现样例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
| import java.util.ArrayList; import java.util.Collection; import java.util.HashSet;
public class ArrangeAndCombination {
private static int m, n, COUNT;
public static void main(String[] args) { m = 10; n = 3;
COUNT = 0; nCm(1, new HashSet<>()); System.out.println("=== 组合 ==="); System.out.println(COUNT);
COUNT = 0; nAm(new ArrayList<>()); System.out.println("=== 排列 ==="); System.out.println(COUNT); }
private static void nCm(int start, Set<Integer> selected) { if (selected.size() == n) { printResult(selected); return; } for (int i = 1; i <= m; i++) { selected.add(i); nCm(i + 1, selected); selected.remove(i); } }
private static void nAm(List<Integer> selected) { if (selected.size() == n) { printResult(selected); return; } for (int i = 1; i <= m; i++) { if (!selected.contains(i)) { selected.add(i); nAm(selected); selected.remove((Object) i); } } }
private static void printResult(Collection<Integer> selected) { StringBuilder sb = new StringBuilder(); selected.forEach(x -> sb.append(",").append(x)); System.out.println(sb.substring(1)); COUNT++; } }
|
欢迎关注我的公众号 须弥零一,跟我一起学习IT知识。
如果您喜欢此博客或发现它对您有用,则欢迎对此发表评论。 也欢迎您共享此博客,以便更多人可以参与。 如果博客中使用的图像侵犯了您的版权,请与作者联系以将其删除。 谢谢 !