TODO写的很差,需要重写
问题
在写OS作业的时候,银行家算法检查安全序列需要用到全排列,所以来写一下。题目如下:
- 给定一个没有重复数字的序列,返回其所有可能的全排列。
1 | 输入: [1,2,3] |
思路
- 我们把在纸笔上写的时候,通常会分情况写。
1
2
3
4
5
6
7
81 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
把每一个值作为开头的情况都分类写出来。
我们可以把这种写法进行推广
可以发现,以某一值开头的情况,是把开头值除去之后的序列的全排列。
如
1 | 1 2 3 4 |
- 其中 234、243、324、342、423、432是数列234的全排列
看到这,可以想到用递归的方式来完成。现在想想代码怎么实现。
- 我们要让序列中每一个元素都做一次开头,也就是要把每个元素的和开头位交换
- 交换之后,就是进入以X开头的情况了,用除去X的子序列进行递归
- 注意,我们需要每个元素的和开头位换回去,防止重复。
TODO
实现
1 | void swap(int arr[], int a, int b) { |