46. 全排列

给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。

示例 1:

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

示例 2:

输入:nums = [0,1]
输出:[[0,1],[1,0]]

示例 3:

输入:nums = [1]
输出:[[1]]

搜索回溯

思路和算法

**这个问题可以看作有 n 个排列成一行的空格,我们需要从左往右依此填入题目给定的 n 个数,每个数只能使用一次。**那么很直接的可以想到一种穷举的算法,即从左往右每一个位置都依此尝试填入一个数,看能不能填完这 n 个空格,在程序中我们可以用「回溯法」来模拟这个过程。我们定义递归函数 b a c k t r a c k ( f i r s t , o u t p u t ) backtrack(first,output) backtrack(first,output)表示从左往右填到第 first 个位置,当前排列为 output。 那么整个递归函数分为两个情况:

  • 如果 first=n,说明我们已经填完了 n 个位置(注意下标从 0 开始),找到了一个可行的解,我们将 output 放入答案数组中,递归结束。
  • 如果 first<n,我们要考虑这第 first 个位置我们要填哪个数。根据题目要求我们肯定不能填已经填过的数,因此很容易想到的一个处理手段是我们定义一个标记数组 vis 来标记已经填过的数,那么在填第 first 个数的时候我们遍历题目给定的 n 个数,如果这个数没有被标记过,我们就尝试填入,并将其标记,继续尝试填下一个位置,即调用函数backtrack(first+1,output)。回溯的时候要撤销这一个位置填的数以及标记,并继续尝试其他没被标记过的数。

时间复杂度:O(n×n!),其中 n 为序列的长度。算法的复杂度首先受 backtrack 的调用次数制约,这说明 backtrack 的调用次数是 O*(*n!) 的。

空间复杂度:O(n),其中 n 为序列的长度。除答案数组以外,递归函数在递归过程中需要为每一层递归函数分配栈空间,所以这里需要额外的空间且该空间取决于递归的深度,这里可知递归调用深度为 O(n)。

class Solution:def permute(self, nums: List[int]) -> List[List[int]]:def backtrack(first = 0):# 所有数都填完了if first == n:  res.append(nums[:])for i in range(first, n):# 动态维护数组nums[first], nums[i] = nums[i], nums[first]# 继续递归填下一个数backtrack(first + 1)# 撤销操作,回到上一次操作,选择其他分支nums[first], nums[i] = nums[i], nums[first]n = len(nums)res = []backtrack()return res

47. 全排列 II

给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。

示例 1:

输入:nums = [1,1,2]
输出:
[[1,1,2],[1,2,1],[2,1,1]]

示例 2:

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

搜索回溯

解决重复问题,我们只要设定一个规则,保证在填第 idx 个数的时候重复数字只会被填入一次即可。而在本题解中,我们选择对原数组排序,保证相同的数字都相邻,然后每次填入的数一定是这个数所在重复数集合中「从左往右第一个未被填过的数字」,即如下的判断条件:

if i>0 and nums[i] == nums[i-1] and not used[i-1]:continue
class Solution:def permuteUnique(self, nums: List[int]) -> List[List[int]]:res = []  #存放符合条件结果的集合path = []  #用来存放符合条件的结果used = [0] * len(nums)  # 元素是否已被使用def backtrack():# 终止条件if len(path) == len(nums):res.append(path[:])for i in range(len(nums)):if not used[i]:if i>0 and nums[i] == nums[i-1] and not used[i-1]:continueused[i] = 1path.append(nums[i])backtrack()  #递归path.pop()  #回溯used[i] = 0nums.sort()backtrack()return res

46. 全排列 47. 全排列 II相关推荐

  1. 46. 全排列/47. 全排列 II

    2020-07-25 1.题目描述 给定一个 没有重复 数字的序列,返回其所有可能的全排列. 2.题解 交换元素 3.代码 class Solution {public:vector<vecto ...

  2. 46.全排列 47.全排列 II

    题目 给定一个 没有重复 数字的序列,返回其所有可能的全排列. 示例: 输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [ ...

  3. 【数字全排列】LeetCode 47. Permutations II

    LeetCode 47. Permutations II Solution1:我的答案 笨蛋方法:和第46题的思路差不多,把vector换成了set就OK啦~~~ class Solution { p ...

  4. Suzy加油吧 Day 29 | 回溯算法进行中:491. 递增子序列,46 全排列,47 全排列2

    491. 递增子序列(新 & 难) 呜呜呜呜呜 题目 给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素 .你可以按 任意顺序 返回答案. 数组 ...

  5. [LeetCode]47. 全排列 II

    47. 全排列 II 难度中等761收藏分享切换为英文接收动态反馈 给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列. 示例 1: 输入:nums = [1,1,2] 输出 ...

  6. LeetCode 47. 全排列 II【数组,回溯算法,排序去重】

    47. 全排列 II 给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列. 示例 1: 输入:nums = [1,1,2] 输出: [[1,1,2], [1,2,1], [2 ...

  7. LeetCode 47 全排列 II -- 回溯法

    来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/permutations-ii 题意: 给定一个可包含重复数字的序列 nums ,按任意顺序 返 ...

  8. LeetCode 47. 全排列 II

    文章目录 解法1:回溯 + 剪枝 牛客网的全排列 https://leetcode-cn.com/problems/permutations-ii/ 难度:中等   给定一个可包含重复数字的序列,返回 ...

  9. leetcode 47. 全排列 II 思考分析

    题目 给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列. 思考分析以及代码 这一题和前面的做过的两个题目有所关联: leetcode 46. 全排列 思考分析 再加上lee ...

最新文章

  1. 反激qr工作原理_锂电池均衡电路的工作原理
  2. 学习笔记:UINavigationbar的背景修改方法集合
  3. java 压缩汉字字节_java中计算汉字的字节数
  4. 再有人问你volatile是什么,就把这篇文章发给他
  5. 申请 Let's Encrypt 数字证书,并安装cerbot快速上手教程~~
  6. 原型 / 构造函数 / 实例/原型链
  7. 使用web.xml控制Web应用的行为
  8. 信息学奥赛c++ 初学保姆级教程
  9. word公式编辑器复制粘贴未响应_word公式编辑器常见问题汇总,附带解决方法
  10. A callback was made on a garbage collected delegate of type...
  11. ECMALL买家取消退款
  12. 苹果微信多开_史上最全微信双开 全平台【IOS/安卓/WIN】
  13. 【无标题】USB2514i USB HUB使用经验总结
  14. 大话nub七(Nbu备份恢复Vmware 虚拟机)
  15. 2020机器视觉公司排名
  16. C语言浮点数存储规则
  17. 付费解谜游戏《纪念碑谷》如何一周内登上榜首?
  18. 软件著作权申请需要的材料有哪些?
  19. SQL跟踪步骤--图文演示
  20. 关于Pandas replace 函数的使用

热门文章

  1. windows server 2016搭建WDS和WSUS服务
  2. (70条消息) COUNT()函数详解
  3. C语言求最大公约数和最小公倍数(思路清晰+拓展)
  4. 班班通计算机工作总结,“班班通”使用工作总结
  5. 投资组合分析1(ZTEHK VA ZTEA)
  6. 淼瀛正式推出MoAir 物体识别SDK 小白用手机即可完成机器学习
  7. 计算机操作系统感悟随笔--内存空间管理
  8. 数字图像处理:实验六 图像分割
  9. python导入数据库怎么导入_python3 导入 数据库
  10. 基于单片机的家用应急电源设计