提起全排列,第一印象是不是大学概率中的排列和组合呢,回头翻了翻书(怪自己太笨,记不住),才发现全排列是排列的一种。那就先延伸一下排列组合呗。

排列

一般地说,从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实现)相关推荐

  1. Java基础第一讲:Java的故事和Java编程环境搭建

    { Android学习指南 } 适于自学的ANDORID学习指南,基于ANDROID 2.2.2.3.3及3.0版本讲解 <ANDROID学习指南>目录 RSS Java基础第一讲:Jav ...

  2. Java基础-->一篇讲全Java常用类(详细易懂,建议收藏)

    Java基础–>一篇讲全Java常用类(详细易懂,建议收藏) 文章目录 Java基础-->一篇讲全Java常用类(详细易懂,建议收藏) 1.字符串相关的类 String类 概述 创建Str ...

  3. Java基础知识第二讲:Java开发手册/JVM/集合框架/异常体系/Java反射/语法知识/Java IO

    Java基础知识第二讲(Java编程规范/JVM/集合框架/异常体系/Java反射/语法知识/Java IO/码出高效) 分享在java学习及工作中,常使用的一些基础知识,本文从JVM出发,讲解了JV ...

  4. 如何学IT?零基础入门自学Java编程系列:java简介跟计算机常识

    学习Java我们应该懂的一些常识 作为IT人士,那什么叫IT呢? 即信息技术,主要用于管理和处理信息所采用的各种技术的总称.IT业务是很广的.比如经历了最早一批大型机发展到PC电脑端,再到互联网高速发 ...

  5. 视频教程-Java进阶高手课-Spring精讲精练-Java

    [ [这里是图片001] Java进阶高手课-Spring精讲精练 中国科学技术大学硕士研究生,丹麦奥尔堡大学访问学者,先后就职于eBay.蚂蚁金服.SAP等国内外一线互联网公司,在Java后端开发. ...

  6. 没有基础可以学java吗?零基础学java

    很多人都知道Java作为市场第一大语言,其发展前景也是很可观的.无论IT市场需求如何变动,其Java的霸主地位依然未曾动摇,这足矣见证Java对于IT行业的作用以及价值何其之大.但是有可观的一面必然会 ...

  7. 零基础入门学习Java,这几本经典的Java学习书籍,可以推荐你看下,绝对受益匪浅!

    书是人类不可或缺的精神食粮.正如高尔基所言:书是人类进步的阶梯.借名人名言给大家推荐一些对java学习有用的经典书籍,对程序员来说,我觉得最佳学习方式还是看书,看视频花费时间太长,而阅读博客则不够系统 ...

  8. python零基础推荐书籍_零基础入门学习Java,这几本经典的Java学习书籍,可以推荐你看下,绝对受益匪浅!...

    书是人类不可或缺的精神食粮.正如高尔基所言:书是人类进步的阶梯.借名人名言给大家推荐一些对java学习有用的经典书籍,对程序员来说,我觉得最佳学习方式还是看书,看视频花费时间太长,而阅读博客则不够系统 ...

  9. 零基础怎么学好Java?正确的学习方法很重要

    Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,它具有良好的通用性.高效性.平台移植性和安全性,广泛用于个人PC.数据中心.游戏控制台等,同时拥有较大的开发者专业社群. 在全球云计算和移 ...

最新文章

  1. php filter 文件包含,php://filter(文件包含漏洞利用)及php://input
  2. (转载)四种常见的 POST 提交数据方式
  3. SAP CRM Cross Component级别的跳转如果出了问题,该如何调试
  4. java 数组中某个数出现的概率_剑指Offer解题报告(Java版)——排序数组中某个数的个数 38...
  5. java 8 lambda reduce_java8种的reduce方法和lambda表达式结合使用
  6. 【CVTE Web后台开发实习生 线下面试】总结
  7. 获取mssqlserver数据库表的字段名称,字段说明,数据类型,主键等表的信息
  8. ant批量处理word文件内容_word多个文件批量替换内容
  9. WinInet 错误代码 (12001 - 12156 )
  10. layui框架引入TP教程
  11. 投票和排名系统C语言顺序表,电视大赛观众投票及排名系统C语言设计.docx
  12. 网络安全:ARP和IP协议
  13. linux卸载软件wine,Ubuntu 卸载wine
  14. 戴尔惠普华硕笔记本Fn键反了,按F1、F2等键出来Fn+F1、F2的效果
  15. 怎么用优动漫PAINT做出色彩的朦胧感?
  16. python3中eval函数用法简介_python3中eval函数用法使用简介
  17. 微信小程序万里目_微信小程序加盟千万别忘了几个基本要求
  18. [1151]python连接 redis cluster集群
  19. Maya导出ASCII格式的FBX文件
  20. [软件项目管理] BCWS、BCWP、ACWP的理解

热门文章

  1. 安装floodlight和mininet环境
  2. NASM学习(二)——从命令行获取参数
  3. zk安装启动(windows版本)
  4. SQL SELECT TOP
  5. 推荐系统冷启动解决方法
  6. 活着,本身就是最美的事 唯美生活生命感悟美文
  7. 【北京】VMware vForum 2012 开发者盛会(11月20-21日)
  8. 【linux进阶4】apache的服务使用(图文详解apache的多种使用方式)
  9. 最后一片叶子--欧亨利
  10. 华为交换机默认密码_华为防火墙路由器三层交换机的维护时都少不了这几条命令...