78. 子集

class Solution:def subsets(self, nums: List[int]) -> List[List[int]]:ans = []cur = []def dfs(i):if i == len(nums):ans.append(cur.copy())return# 包括 nums[i]cur.append(nums[i])dfs(i+1)# 不包括 nums[i]cur.pop()dfs(i+1)dfs(0)return ans

要找出所有子集,对于数组里的每个元素,都只有选或不选两种情况,所以从下标 i = 0 开始,包括或不包括 nums[i],然后对下一个位置 i + 1 进行同样操作。由于 cur 数组是会变的,所以要 copy 或者 cur[:]

77. 组合

class Solution:def combine(self, n: int, k: int) -> List[List[int]]:ans = []cur = []def dfs(start):if len(cur) == k:ans.append(cur.copy())returnif start > n:returnfor i in range(start, n + 1):cur.append(i)dfs(i + 1)cur.pop()dfs(1)return ans

对于组合,考虑了数字 i,后面添加的数要大于 i

39. 组合总和

class Solution:def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:ans = []cur = []def dfs(i, total):if total == target:ans.append(cur.copy())returnif i >= len(candidates) or total > target:returncur.append(candidates[i])dfs(i, total + candidates[i])cur.pop()dfs(i + 1, total)dfs(0, 0)return ans

46. 全排列

class Solution:def permute(self, nums: List[int]) -> List[List[int]]:ans = []cur = []counter = collections.Counter(nums)def dfs():if len(cur) == len(nums):ans.append(cur.copy())returnfor i in counter:if counter[i] > 0:cur.append(i)counter[i] -= 1dfs()cur.pop()counter[i] += 1dfs()return ans

排列从思路上是逐个添加,但是代码实现上要用逐个排除的方法。

90. 子集 II

class Solution:def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:ans = []cur = []nums.sort()def dfs(i):if i == len(nums):ans.append(cur.copy())returncur.append(nums[i])dfs(i+1)cur.pop()while i + 1 < len(nums) and nums[i] == nums[i + 1]:i += 1dfs(i+1)dfs(0)return ans

40. 组合总和 II

class Solution:def combinationSum2(self, candidates: List[int], target: int) -> List[List[int]]:candidates.sort()ans = []cur = []def dfs(pos, total):if total == target:ans.append(cur.copy())returnif pos >= len(candidates) or total > target:returnpre = -1for i in range(pos, len(candidates)):if candidates[i] == pre:continuecur.append(candidates[i])dfs(i + 1, total + candidates[i])cur.pop()pre = candidates[i]dfs(0, 0)return ans

47. 全排列 II

class Solution:def permuteUnique(self, nums: List[int]) -> List[List[int]]:ans = []cur = []counter = collections.Counter(nums)def dfs():if len(cur) == len(nums):ans.append(cur.copy())returnfor i in counter:if counter[i] > 0:cur.append(i)counter[i] -= 1dfs()cur.pop()counter[i] += 1dfs()return ans

回溯的问题合集(Leetcode题解-Python语言)相关推荐

  1. 一般动态规划问题合集(Leetcode题解-Python语言)

    118. 杨辉三角 class Solution:def generate(self, numRows: int) -> List[List[int]]:dp = [[0] * i for i ...

  2. 矩阵模拟问题合集(Leetcode题解-Python语言)

    54. 螺旋矩阵(剑指 Offer 29. 顺时针打印矩阵) class Solution:def spiralOrder(self, matrix: List[List[int]]) -> L ...

  3. 哈希表(散列表)基础概念与经典题目(Leetcode题解-Python语言)之中——实际应用

    上一节介绍了哈希表的原理与设计方法,这一节则直接python中现有的哈希表类型:哈希集合 set(集合)和哈希映射 dict(字典)来解决实际应用(刷题). 零.概念 在介绍实际应用之前,有一个概念我 ...

  4. 二叉树层序遍历(广度优先搜索)基础概念与经典题目(Leetcode题解-Python语言)

    二叉树的广度优先搜索即从上到下.从左到右地进行搜索,对于层序遍历(Level Order)问题,即依次遍历第一层节点.第二层节点-等,基本可以秒杀. 广度优先搜索是通过队列来实现的,python中优先 ...

  5. 两数、三数、四数之和相关题目(Leetcode题解-Python语言)

    作为 Leetcode 的第一题,两数之和自然是知名度最高的,从两数之和出发也有不少的衍生题目,下面就让我们好好地解决它们. 1. 两数之和 class Solution:def twoSum(sel ...

  6. 字符串匹配经典题目——KMP算法(Leetcode题解-Python语言)

    28. 实现 strStr() strStr(haystack: str, needle: str) 的作用就是在 haystack 字符串(长度为 n)中找出 needle 字符串(长度为 m)出现 ...

  7. 队列的基础概念与经典题目(Leetcode题解-Python语言)

    队列是先入先出(后入后出)的数据结构,常用操作就 push 和 popleft,Python中用列表中的 pop(0) 或者 collection.deque的 popleft() 都可以. 普通队列 ...

  8. 在数组中找重复数、只出现一次的数或丢失数的题目(Leetcode题解-Python语言)

    在一维数组中的考察中,最常见的就是找出数组中的重复数.只出现一次的数或者丢失(消失)数等等. 一般来说,首先想到的就是用哈希表(集合)来记录出现过的数,基本所有的题都可以用集合来做,而技巧性在于有时可 ...

  9. 栈的基础概念与经典题目(Leetcode题解-Python语言)

    栈是先入后出(后入先出)的数据结构,常用操作就 push 和 pop,Python中用列表实现即可,基本概念可以看Leetbook相关章节. 普通栈 232. 用栈实现队列 class MyQueue ...

最新文章

  1. 论Java程序的运行机制
  2. 关于C#内存释放的BUG?
  3. ibatis学习笔记
  4. python获取最近N天工作日列表、节假日列表
  5. java teechart怎么用_TeeChart使用范例
  6. 执行AJAX返回HTML片段中的JavaScript脚本
  7. 重读《从菜鸟到测试架构师》--黑色的盒子里有什么(中)
  8. 第三十三章 机械化印刷
  9. python中组合数据类型、函数和代码复用的难点_Python电子教案5-2 函数和代码复用...
  10. git push 提示:更新被拒绝,因为您当前分支的最新提交落后于其对应的远程分支。的解决办法
  11. 中文GRasshopper插件lunchbox(午餐盒),首发哦!
  12. Java SSM面试题
  13. 蚁群算法原理及其实现(python)
  14. 使用layer 弹出对话框 子父页面相互参数传递 父页面获取子页面参数实例
  15. Java字符串使用及运算符详解
  16. Gameplay常用编写方法(持续更新)
  17. 【C语言】剖析函数递归(3)
  18. NTP调整系统时间同步
  19. typecpd协议规范 C语言,USB-C(USB Type-C)规范的简单介绍和分析
  20. 听高级产品经理来聊一聊,什么是产品架构

热门文章

  1. [转]在C#中像Python一样编写TensorFlow机器学习代码
  2. 【重磅】ArcGIS 10.8手把手经典图文安装教程(附安装包全套装下载,亲测可用)
  3. C语言试题三十五之找出一维整型数组元素中最大的值和它所在的下标,最大的值和它所在的下标通过形参传回。主函数中x是数组名,n 是x中的数据个数,max存放最大值,index存放最大值所在元素的下标。
  4. linux shell之字符串的比较
  5. Git之如何解决sourceTree已经pull全部下来但是本地没有更新的问题
  6. qt qss设置字体大小_Qt编写自定义控件70-扁平化flatui
  7. 世界上最美的40个小镇,每一个都犹如仙境!
  8. 重磅!Nature盘点年度十佳论文,生命科学占据半壁江山,中国学者表现亮眼
  9. 国内 GitHub 造假黑色产业链曝光;开源开发者撤销对 ICE 禁用的决定
  10. 17道因为太难而被禁用的Google面试题