这里我们使用
“箭头”
的方式来进行排列的讲解
比如给个三位数字【1,2, 3】求有多少种组合方式:
结果其实很简单:123 132 213 231 312 321 无非就是这六种
用代码实现的话普遍时间复杂度在大于 O(n!),小于 O(n∗n!)
这里我要讲的是另外一种方式,主要是靠“移动”来进行排列的负责度只有O(n!)
这里用三位数来讲解一下
[1,2,3]
先文字说明一下,后面代码实现
这里的话要实现移动排列的话首先要明白这两个步骤的意思:(主要按照下面图一、
图而来说明)
步骤1、找到最大能够移动的数字(图一)
最大:不一定是数组中最大的,而是需要能够移动的最大的数字;
能够移动:
(1):箭头代表方向,首先这个数字头上箭头所指的方向
必须要有数字,
比如(参考下面图一):3头上箭头指向左边,左边还有5,4两个数字,
这个可以,又比如4头像箭头指向左边,但是左边没有数字,
所以4不满足条件,不能够移动(但是最后能不能移动还不能
只靠有没有数字来决定,还需要第二个条件,如下)
(2):除了箭头所指的方向有数据以外,还要要求箭头所指方向的数据
要比当前数小才行,
比如(参考下面图一):在第一个条件中说到3可以移动,但是他不满
足第二个条件,因为3的箭头是向左边的,左边的数据5大于3,
所以3不能移动。
下图中唯一可以移动的是5,说明:5的箭头是向右的,右边右数据,
满足第一个条件,右边的数据是3,比5小,满足第二个条件,
所以5可以移动
步骤2、每次向左或者向右移动一位的时候需要做的两件事:(图二)
(1):移动的话需要调换两个数的位置
(2):然后就是把 比当前移动的数大的其它数的箭头掉转方向
说明(参考下面图二)
每一次移动都要满足上面两个步骤才算是成功移动
图一
图二
正式开始排列了
一直移动,直到没有数可以移动了就好了,所以只有六种
代码没有去实现,后期补上,你们可以试着去敲一下,