微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

基于Python数据结构之递归与回溯搜索

今天小编就为大家分享一篇基于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 举报,一经查实,本站将立刻删除。

相关推荐