1. 题目
给定一个不含重复数字的数组 nums
,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
2. 题解思路分析
本题目就是高中的全排列题目,先来看规律。
-
当输入 nums = [1] 时,就只有一个,因此就只有一种排序方式 [1]。
-
当输入 nums = [1, 2] 时,两个数字,有两种排序的方式: [2, 1], [1, 2] 。新出现的两种排序,可以先把 1 固定下来,就是上面的 [1], 此时,在将 2 插入到 [1] 这个队列中,有两种方式,插入 index 为 0 的位置,即 [2, 1], 另一种是插入 index 为 1 的位置, 即 [1, 2]
-
当输入 nums = [1, 2, 3] 时,如第二步描述,三个数的输入就是将第三个数 3 分别插入只有两个数组成的所有队列中。 所以,逻辑很简单,两个数的第一个队列为 [2, 1], 因此 3 可以插入这个对列 0, 1, 2 三个位置,分别得到 [3, 2, 1], [2, 3, 1],[2, 1 , 3]。同理可得到另个三个队列
按照这个思路就可以很容易把代码写出来了。
3. 代码实现
此处使用的 kotlin , 代码如下:
fun permute(nums: IntArray): List<List<Int>> {
var result = ArrayList<List<Int>>()
for (item in nums) {
var tempResult = ArrayList<List<Int>>()
if (result.size <= 0) {
tempResult.add(listOf(item))
} else {
result.forEach { listItem ->
for (it in 0..listItem.size) {
var newList = ArrayList<Int>()
newList.addAll(listItem)
newList.add(it, item)
tempResult.add(newList)
}
}
}
result = tempResult
}
return result
}