求数组的全排列算一个十分简单且常见的问题,可以用递归简单的实现。
输入:
[1, 2, 3]
输出:
[1 2 3]
[1 3 2]
[2 1 3]
[2 3 1]
[3 2 1]
[3 1 2]
算法思路:
首先固定第一个元素,然后进行剩余元素的全排列。
例如[1, 2, 3],首先固定1,然后进行[2, 3]的全排列。
然后固定2,然后进行[3]的全排列。
当需要排列的数组只有一个元素的时候就完成了一个。
这里完成的是[1, 2, 3]
下一步就是固定[2, 3]这个序列中的3,然后进行[2]的全排列。
完成了[1, 3, 2]
再接下来固定[1, 2, 3]中的2, 进行[1, 3]的全排列。
...
代码如下:
func combination(arr []int, first, end int) {
// 只剩下了一个元素
// 就得到了一组排列
if first == end {
fmt.Println(arr)
} else {
// 依次交换每一个元素到第一个位置
for i := first; i <= end; i++ {
arr[first], arr[i] = arr[i], arr[first]
combination(arr, first+1, end)
// 交换回来
arr[first], arr[i] = arr[i], arr[first]
}
}
}
网友评论