今天小编就为大家分享一篇基于Python数据结构之递归与回溯搜索,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
目录
1. 递归函数与回溯深搜的基础知识2. 求子集 (LeetCode 78)3. 求子集2 (LeetCode 90)4. 组合数之和(LeetCode 39,40)5. 生成括号(LeetCode 22)6. N皇后(LeetCode 51,52)7. 火柴棍摆正方形(LeetCode 473)1. 递归函数与回溯深搜的基础知识递归是指在函数内部调用自身本身的方法。能采用递归描述的算法通常有这样的特征:为求解规模为N的问题,设法将它分解成规模较小的问题,然后从这些小问题的解方便地构造出大问题的解,并且这些规模较小的问题也能采用同样的分解和综合方法,分解成规模更小的问题,并从这些更小问题的解构造出规模较大问题的解。特别地,当规模N=1时,能直接得解。
回溯法(探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。
2. 求子集 (LeetCode 78 Subsets)
2.1题目
Given a set of distinct integers, nums, return all possible subsets (the power set).
Note: The solution set must not contain duplicate subsets.
For example,
If nums = [1,2,3], a solution is:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
2.2思路
初始化,[ ]的子集为[ [ ] ]
nums[ : n]的子集为所有nums[ : n-1]的子集 加上所有nums[ : n-1]的子集+元素nums[n-1]
2.3代码
class Solution(object): def subsets(self, nums): """ :type nums: List[int] :rtype: List[List[int]] """ size = len(nums) return self.solve(nums, size) def solve(self, nums, n): if n == 0: return [[]] temp = self.solve(nums[:n-1], n-1) ans = temp[:] for i in temp: ans.append(i + [nums[n-1]]) return ans
3. 求子集2 (LeetCode 90 Subsets II)
3.1题目
Given a collection of integers that might contain duplicates, nums, return all possible subsets (the power set).
Note: The solution set must not contain duplicate subsets.
For example,
If nums = [1,2,2], a solution is:
[
[2],
[1],
[1,2,2],
[2,2],
[1,2],
[]
]
3.2思路
在上一题思路的基础上,当nums[i]=nums[i-1]时,添加子集时只需在上一步增加的子集基础上进行添加nums[i],而不需要对所有子集进行添加nums[i]。故在递归返回结果时,返回两个结果,一个是所有子集,还有一个是该步骤中添加的子集的集合。
3.3代码
class Solution(object): def subsetsWithDup(self, nums): """ :type nums: List[int] :rtype: List[List[int]] """ nums.sort() size = len(nums) return self.solve(nums, size)[0] def solve(self, nums, n): if n == 0: return [[]],[[]] if n == 1: return [[],[nums[n-1]]],[[nums[n-1]]] temp = self.solve(nums[:n-1], n-1) ans = temp[0][:] l = len(ans) if nums[n-1] == nums[n-2]: for i in temp[1]: ans.append(i + [nums[n-1]]) else: for i in temp[0]: ans.append(i + [nums[n-1]]) return ans,ans[l:]
4. 组合数之和(LeetCode 39,40 )
4.1题目
LeetCode 39 Combination Sum
Given a set of candidate numbers (C) (without duplicates) and a target number (T), find all unique combinations in C where the candidate numbers sums to T.
The same repeated number may be chosen from C unlimited number of times.
Note:
All numbers (including target) will be positive integers.
The solution set must not contain duplicate combinations.
For example, given candidate set [2, 3, 6, 7] and target 7,
A solution set is:
[
[7],
[2, 2, 3]
]
LeetCode 40 Combination Sum II
Given a collection of candidate numbers (C) and a target number (T), find all unique combinations in C where the candidate numbers sums to T.
Each number in C may only be used once in the combination.
Note:
All numbers (including target) will be positive integers.
The solution set must not contain duplicate combinations.
For example, given candidate set [10, 1, 2, 7, 6, 1, 5] and target 8,
A solution set is:
[
[1, 7],
[1, 2, 5],
[2, 6],
[1, 1, 6]
]
4.2思路
LeetCode 39 Combination Sum
(1)对给定的数字集合进行排序
(2)target=T,从数组中找一个数n,target= T-n,如果target= 0,则寻找成功添加结果,如果taget比候选数字中的最小值还小,则寻找失败,不添加
(3)注意:按从小到大的顺序进行查找,如果某数已找到,则在找下一个时,不包括该数
LeetCode 40 Combination Sum II
该题与上一题相比,区别在于,给定的集合列表中数字可能重复,目标集合中的数字只能使用给定集合中的数字,并且每个数字只能使用一次。注意,由于存在重复的数字,故需要保证结果中的路径集合没有重复。所以当出现candidates[i]==candidates[i-1],跳过。
4.3代码
LeetCode 39 Combination Sum
class Solution(object): def combinationSum(self, candidates, target): """ :type candidates: List[int] :type target: int :rtype: List[List[int]] """ candidates.sort() self.ans = [] self.solve(candidates, target, 0 ,[]) return self.ans def solve(self, candidates, target, start, path): if target == 0: self.ans.append(path) return if target 上一篇:python 写函数在一定条件下需要调用自身时的写法说明下一篇:Python中__init__和__new__的区别详解 热门搜索:
递归回溯
回溯搜索
数据结构与算法
结构数据
数据结构
相关文章
基于Python数据结构之递归与回溯搜索
2021-09-10阅读(5286)评论(0)推荐()今天小编就为大家分享一篇基于Python数据结构之递归与回溯搜索,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
Java数据结构 递归之迷宫回溯案例讲解
2021-10-18阅读(6935)评论(0)推荐()这篇文章主要介绍了Java数据结构递归之迷宫回溯案例讲解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
数据结构 二叉树的递归与非递归
2021-09-13阅读(6999)评论(0)推荐()这篇文章主要介绍了数据结构 二叉树的递归与非递归的相关资料,需要的朋友可以参考下
Python实现的数据结构与算法之基本搜索详解
2021-10-13阅读(6258)评论(0)推荐()这篇文章主要介绍了Python实现的数据结构与算法之基本搜索,详细分析了Python顺序搜索、二分搜索的使用技巧,非常具有实用价值,需要的朋友可以参考下
javascript数据结构之二叉搜索树实现方法
2021-10-16阅读(9429)评论(0)推荐()这篇文章主要介绍了javascript数据结构之二叉搜索树实现方法,较为详细的分析了二叉搜索树的概念、原理与JavaScript实现二叉搜索树的方法,对于学习J...
python 使用递归回溯完美解决八皇后的问题
2021-09-11阅读(10046)评论(0)推荐()今天小编就为大家分享一篇python 使用递归回溯完美解决八皇后的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
C++递归线性阵列搜索数字的方法
2021-10-05阅读(6920)评论(0)推荐()这篇文章主要介绍了C++递归线性阵列搜索数字的方法,涉及C++递归及数组操作的相关技巧,需要的朋友可以参考下
取消
提交评论
© 2021 编程之家
工信部备案号:琼ICP备2022000316号
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。