前言

本系列文章为《leetcode》刷题笔记。

题目位置:力扣中国

项目位置:我的Github项目

题目

给定一个没有重复数字的序列,返回其所有可能的全排列。

示例:

输入: [1,2,3]
输出:
[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]
]

思路

方法一、回溯
这种题目明显是用回溯来做了,因为他的输出结果给的就是回溯的。

回溯的思路就是

  1. 先找一个路径出来,记录下来这个路径。
  2. 擦掉最后一次的查找记录,返回上一层
  3. 重新找倒数第二层,找到以后继续找下一层,直到找到一个新的路径
  4. 限定条件:每一层查找出来的数字都必须和其他不同

所以根据我的思路描述和上图,我的算法计划:

  1. 使用递归,这样每找一层,找下一层的操作就是调用自己
  2. 每层递归都用一个循环遍历原数组所有的元素,每遍历一个就判断一次是否和前面的数重复:所以我们需要一个for循环,需要一个判断用的函数checkIndex
  3. 递归就要有终止条件:这里的终止条件有三个

第一个:找到了完整的路径,为了防止进入下一次递归,立刻跳出当前也就是最后一层递归(也就是当前找的元素没有和前面的重合,而且当然找到的是最后一个元素)

 if checkIndex(indexs, current) {continue}if current == len-1 {//保存找到的路径}

第二个:上一层递归返回,而当前递归的循环已经遍历完了最后一个元素。比如下图的第二层循环已经遍历完了3,所以只能擦掉当前,继续返回了!

代码是:

    for i := 0; i < len; i++ {//此时i==len-1,//...run(indexs, nums, newCurrent, len)indexs[current] = -1}

ps: 有没有可能最后一层递归,所有元素都找遍了,都没有找到呢?不可能!因为前面的所有元素都不重复,递归层数和数组长度相等,所以完全不可能找不到。

时间复杂度 O(N^(N+1)): 因为一层循环是n,有n-1层循环嵌套
空间复杂度 O(h(n)):回溯的空间是动态生成的,如果不要求保留答案,只用输出的话那空间使用h(n),也就是深度。但是这里要求保存结果,就多申请了结果 * 深度 个空间。这是个概率论的题目,结果应该有h(n)!个(阶乘)。

方法二、Python3库函数

Python3 itertools 文档

直接调用库函数itertools.permutations即可

代码

Go


var ResRow [][]intfunc checkIndex(indexs []int, curret int) bool {for i := 0; i < curret; i++ {if indexs[i] == indexs[curret] {return true}}return false
}func run(indexs []int, nums []int, current int, len int) {for i := 0; i < len; i++ {indexs[current] = nums[i]if checkIndex(indexs, current) {continue}if current == len-1 {res_col := make([]int, len)for i := 0; i < len; i++ {res_col[i] = indexs[i]}ResRow = append(ResRow,res_col)indexs[current] = -1return}newCurrent := current + 1run(indexs, nums, newCurrent, len)indexs[current] = -1}
}func permute(nums []int) [][]int {indexs := make([]int, len(nums))//init num_indexsfor i := 0; i < len(nums); i++ {indexs[i] = -1}//runrun(indexs, nums, 0, len(nums))var tmpRow = ResRowResRow = [][]int{}return tmpRow
}

PS: 其实这一题的名字叫八皇后。

Python3

class Solution:def permute(self, nums: List[int]) -> List[List[int]]:return list(itertools.permutations(nums))

LeetCode46:全排列(八皇后)相关推荐

  1. 八皇后时间复杂度_LeetCode46:全排列(八皇后)

    前言 本系列文章为<leetcode>刷题笔记. 题目位置:力扣中国 项目位置:我的Github项目 题目 给定一个没有重复数字的序列,返回其所有可能的全排列. 示例: 输入: [1,2, ...

  2. 递归求解全排列问题以及八皇后问题

    文章目录 全排列问题简介 思路及代码 八皇后问题简介 代码 八皇后代码改进 全排列问题简介 对于全排列问题,我们要做的事是讲1~n个数进行排列组合,并按照字典序由小到大的顺序输出.这个问题的复杂度是O ...

  3. DFS基础-----刷题合集--1(全排列,八皇后,迷宫),让你明白DFS的基础用法

    二刷dfs相关题目 洛谷P1706            全排列 https://www.luogu.com.cn/problem/P1706                              ...

  4. 字符串全排列与组合算法以及八皇后问题

    [剑指offer-题38] 字符串排列 题目 输入一个字符串,输出该字符串的全排列. 思路 数学中的排列思想.算法步骤如下: 求出所有可能出现在第一个位置的字符.将首字符依次与后面的字符交换,即可达到 ...

  5. 运用全排列的方法解决八皇后问题

    运用全排列的方法解决八皇后问题,可以分为两部分:全排列和八皇后,下面我将分开说明两个步骤. 首先说明八皇后: 第一步:就是把皇后按照0到8编号,然后对八个皇后进行全排列,一共有40320种排列方式. ...

  6. 用全排列的方法解决八皇后问题

    用百度搜索八皇后问题,几乎清一色都是用回溯,有兴趣的同学可参考:从全排列和八皇后问题谈回溯. 解决一个问题,我们应该充分利用已有的条件,化繁为简. $a=[0,1,2,3,4,5,6,7]; 可以看到 ...

  7. Scheme来实现八皇后问题(2)

    版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖.如要转贴,必须注明原文网址http://www.cnblogs.com/Colin-Cai/p/9790466.html 作者:窗户QQ/ ...

  8. 程序员面试题精选100题(58)-八皇后问题[算法]

    题目:在8×8的国际象棋上摆放八个皇后,使其不能相互攻击,即任意两个皇后不得处在同一行.同一列或者同一对角斜线上.下图中的每个黑色格子表示一个皇后,这就是一种符合条件的摆放方法.请求出总共有多少种摆法 ...

  9. LeetCode打卡 52八皇后Ⅱ53最大子序和54螺旋矩阵

    原创公众号:bigsai 希望和优秀的你做朋友,感觉不错还请一键三连. 回复进群即可加入和200+人一起打卡.上周打卡: LeetCode 47全排列Ⅱ&48旋转图像 LeetCode 49字 ...

最新文章

  1. AR+ 实时音视频通话,×××无缝结合
  2. vs2015改程序名字
  3. 编译时多态和运行时多态
  4. python中函数的使用_python中的函数的使用示例
  5. CodeForces - 932D Tree(树上倍增,好题)
  6. Laravel 服务提供者和门面模式
  7. 使用Hazelcast发布和订阅
  8. 圆形坠落模拟算法设计
  9. leetcode713. 乘积小于K的子数组(双指针)
  10. 【文末有赠书】从历史角度讲现代数学
  11. 快约 - PHP社交约会平台源码开心版
  12. codeblocks和vscode编译时弹出不支持的16位程序解决方案
  13. 头条号【编编成程】开通
  14. c语言中的正号运算符,C语言 运算符
  15. AI轻松入门,AI零基础入门,AI初级教学,
  16. eclips无法查看源码
  17. mysql仿网易评论_Android仿抖音评论列表(加评论功能)/网易云音乐列表
  18. DA14580软件开发平台参考(一)
  19. 计算机网络网络适配器的作用是什么原因,网络适配器是什么东西?网络适配器主要功能...
  20. 2018 Intellij IDEA 最新旗舰版注册激活破解

热门文章

  1. 过采样算法之SMOTE
  2. 广东专升本C语言程序设计(完结)
  3. 使用Matlab调用动态链接库dll
  4. Swing游戏开发——飞机大战
  5. Linux服务器压测/拷机软件收集
  6. Ubuntu 16.04 LTS 初体验
  7. STM8S103调试PWM的踩坑过程
  8. 个人关于面试的一些总结
  9. 主成分分析(PCA)原理及推导
  10. 乐优商城架构介绍(一)