LeetCode 46 全排列

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
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值