LeetCode46:全排列(八皇后)

简介: LeetCode46:全排列(八皇后)

前言

本系列文章为《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. 限定条件:每一层查找出来的数字都必须和其他不同


image.png

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


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


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

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


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


aHR0cHM6Ly9jb2RpbmczbWluLm9zcy1hY2NlbGVyYXRlLmFsaXl1bmNzLmNvbS9jb2RpbmczbWluLzIwMjAtMDMtMDctMDQzOTAyLmpwZw.png



代码是:


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 [][]int
func 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] = -1
      return
    }
    newCurrent := current + 1
    run(indexs, nums, newCurrent, len)
    indexs[current] = -1
  }
}
func permute(nums []int) [][]int {
  indexs := make([]int, len(nums))
  //init num_indexs
  for i := 0; i < len(nums); i++ {
    indexs[i] = -1
  }
  //run
  run(indexs, nums, 0, len(nums))
  var tmpRow = ResRow
  ResRow = [][]int{}
  return tmpRow
}

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


Python3


class Solution:
    def permute(self, nums: List[int]) -> List[List[int]]:
        return list(itertools.permutations(nums))
相关文章
|
7月前
|
Java
leetcode-46:全排列
leetcode-46:全排列
46 1
|
7月前
leetcode47全排列2刷题打卡
leetcode47全排列2刷题打卡
39 0
|
7月前
|
Java
46. 全排列 --力扣 --JAVA
给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
43 0
|
2月前
|
算法
Leetcode第46题(全排列)
这篇文章介绍了LeetCode第46题“全排列”的解题方法,使用深度优先搜索(DFS)和回溯算法来生成给定数组的所有可能排列。
41 0
Leetcode第46题(全排列)
|
2月前
Leetcode第47题(全排列II)
LeetCode第47题要求返回一个包含重复数字序列的所有不重复全排列,通过深度优先搜索和去重策略来解决。
34 0
|
4月前
|
算法
LeetCode第46题全排列
LeetCode第46题"全排列"的解题方法,利用回溯法避免重复并确保元素的有序性,生成所有可能的排列组合。
LeetCode第46题全排列
|
4月前
|
算法
LeetCode第47题全排列II
LeetCode第47题"全排列II"的解题方法,通过排序和添加去重逻辑,使用回溯法避免生成重复的排列组合。
|
4月前
|
Python
【Leetcode刷题Python】46. 全排列
本文介绍了LeetCode题目46的Python编程解决方案,题目要求给定一个不含重复数字的数组,返回该数组所有可能的全排列。
29 0
|
6月前
|
机器学习/深度学习 存储 算法
Python5种算法回溯+剪枝、字典序、递归交换、计数回溯、迭代法 实现全排列ll【力扣题47】
Python5种算法回溯+剪枝、字典序、递归交换、计数回溯、迭代法 实现全排列ll【力扣题47】
|
7月前
|
Go
golang力扣leetcode 47.全排列II
golang力扣leetcode 47.全排列II
86 0