从基础讲全排列(Java实现)
提起全排列,第一印象是不是大学概率中的排列和组合呢,回头翻了翻书(怪自己太笨,记不住),才发现全排列是排列的一种。那就先延伸一下排列
和组合
呗。
排列
一般地说,从n个不同元素中,任取m(m≤n)个元素,按照一定的顺序排成一列,这就叫做从n个元素中取出m个元素的一个排列。
在排列数公式中,当m=n时,有:
这表明,n个不同元素全部取出来排列的排列数等于自然数1到n的连乘积。n个不同元素,全部取出的一个排列叫做n个不同元素的一个全排列。
自然数1到n的连乘积叫做n的阶乘,用n!表示,所以n个不同元素的全排列公式则为:
例如:写出一个数组{a,b,c}的全排列。
对于初学者可以先画下图来算出:
共6个排列,这个数值6是可以根据乘法原理算出来的。第一次有3种选择,第二次有2种选择,第三次就有1种选择。据此共有N=3 X 2 X 1=6种。
先看两道题,旷视最近笔试考了这么一道题:
对于这道题你有思路吗?可以这样考虑:
a) 七人的全排列有A(7,7)=5040种排法,由于A,B是对等的,也就是说A在B的左边和B在A的左边的
站法数量是相同的,所以有A(7,7)/2=2520种;
b)把AB当成一个整体,求全排列,就是6! = 720
算法实现
public static void perm(int A[], int p, int q){if(p == q){// 输出所有结果printAll(A, q+1);}else{int i;for(i=p; i<=q; i++){// 交换swap(A, p, i);perm(A, p+1, q);swap(A, p, i);}}}
}
算法讲解
这里的实现使用了递归,递归需要满足是三个条件:
- 一个问题的解可以分解为几个子问题的解;
- 这个问题与分解之后的子问题,除了数据规模不同,求解思路完全一样;
- 存在递归终止条件
我们依次对标,上面对3个字母求全排列对递归的使用不太明显,我们来举4个数字的例子
通过上述的输出结果,可以通过debug断点走一遍,你应该可以理解。其中,第一个swap()是把每个元素都和第一个元素进行交换,第二个swap()方法是将上一次的交换归为原位置,避免重复。
这里给大家推荐一个视频,我的思路基本来自这个
视频。
具体代码请移步到我的github上。
从基础讲全排列(Java实现)相关推荐
- Java基础第一讲:Java的故事和Java编程环境搭建
{ Android学习指南 } 适于自学的ANDORID学习指南,基于ANDROID 2.2.2.3.3及3.0版本讲解 <ANDROID学习指南>目录 RSS Java基础第一讲:Jav ...
- Java基础-->一篇讲全Java常用类(详细易懂,建议收藏)
Java基础–>一篇讲全Java常用类(详细易懂,建议收藏) 文章目录 Java基础-->一篇讲全Java常用类(详细易懂,建议收藏) 1.字符串相关的类 String类 概述 创建Str ...
- Java基础知识第二讲:Java开发手册/JVM/集合框架/异常体系/Java反射/语法知识/Java IO
Java基础知识第二讲(Java编程规范/JVM/集合框架/异常体系/Java反射/语法知识/Java IO/码出高效) 分享在java学习及工作中,常使用的一些基础知识,本文从JVM出发,讲解了JV ...
- 如何学IT?零基础入门自学Java编程系列:java简介跟计算机常识
学习Java我们应该懂的一些常识 作为IT人士,那什么叫IT呢? 即信息技术,主要用于管理和处理信息所采用的各种技术的总称.IT业务是很广的.比如经历了最早一批大型机发展到PC电脑端,再到互联网高速发 ...
- 视频教程-Java进阶高手课-Spring精讲精练-Java
[ [这里是图片001] Java进阶高手课-Spring精讲精练 中国科学技术大学硕士研究生,丹麦奥尔堡大学访问学者,先后就职于eBay.蚂蚁金服.SAP等国内外一线互联网公司,在Java后端开发. ...
- 没有基础可以学java吗?零基础学java
很多人都知道Java作为市场第一大语言,其发展前景也是很可观的.无论IT市场需求如何变动,其Java的霸主地位依然未曾动摇,这足矣见证Java对于IT行业的作用以及价值何其之大.但是有可观的一面必然会 ...
- 零基础入门学习Java,这几本经典的Java学习书籍,可以推荐你看下,绝对受益匪浅!
书是人类不可或缺的精神食粮.正如高尔基所言:书是人类进步的阶梯.借名人名言给大家推荐一些对java学习有用的经典书籍,对程序员来说,我觉得最佳学习方式还是看书,看视频花费时间太长,而阅读博客则不够系统 ...
- python零基础推荐书籍_零基础入门学习Java,这几本经典的Java学习书籍,可以推荐你看下,绝对受益匪浅!...
书是人类不可或缺的精神食粮.正如高尔基所言:书是人类进步的阶梯.借名人名言给大家推荐一些对java学习有用的经典书籍,对程序员来说,我觉得最佳学习方式还是看书,看视频花费时间太长,而阅读博客则不够系统 ...
- 零基础怎么学好Java?正确的学习方法很重要
Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,它具有良好的通用性.高效性.平台移植性和安全性,广泛用于个人PC.数据中心.游戏控制台等,同时拥有较大的开发者专业社群. 在全球云计算和移 ...
最新文章
- php filter 文件包含,php://filter(文件包含漏洞利用)及php://input
- (转载)四种常见的 POST 提交数据方式
- SAP CRM Cross Component级别的跳转如果出了问题,该如何调试
- java 数组中某个数出现的概率_剑指Offer解题报告(Java版)——排序数组中某个数的个数 38...
- java 8 lambda reduce_java8种的reduce方法和lambda表达式结合使用
- 【CVTE Web后台开发实习生 线下面试】总结
- 获取mssqlserver数据库表的字段名称,字段说明,数据类型,主键等表的信息
- ant批量处理word文件内容_word多个文件批量替换内容
- WinInet 错误代码 (12001 - 12156 )
- layui框架引入TP教程
- 投票和排名系统C语言顺序表,电视大赛观众投票及排名系统C语言设计.docx
- 网络安全:ARP和IP协议
- linux卸载软件wine,Ubuntu 卸载wine
- 戴尔惠普华硕笔记本Fn键反了,按F1、F2等键出来Fn+F1、F2的效果
- 怎么用优动漫PAINT做出色彩的朦胧感?
- python3中eval函数用法简介_python3中eval函数用法使用简介
- 微信小程序万里目_微信小程序加盟千万别忘了几个基本要求
- [1151]python连接 redis cluster集群
- Maya导出ASCII格式的FBX文件
- [软件项目管理] BCWS、BCWP、ACWP的理解