![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
递归专题
aaaqqq1234
这个作者很懒,什么都没留下…
展开
-
判断一棵树是不是另一棵树的子树
题目判断b是不是a的子树思路先判断根节点是否一样,若一样则递归判断左右子树,若不一样就用b的根节点去比较a的左右子树。代码# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution: def HasSubtree(self, p原创 2020-08-12 15:57:26 · 203 阅读 · 0 评论 -
归并排序
归并排序思路先分再合,递归。先一份为二,进行排序,在把分成的每个部分在排序。def merge_sort(list): if len(list) <= 1: return list m = len(list)//2 a = merge_sort(list[:m]) b = merge_sort(list[m:]) return merge(a,b)def merge(a,b): c = [] while len(a)>0 and len(b)>原创 2020-07-08 22:31:24 · 108 阅读 · 0 评论 -
选择排序
选择排序思路每一轮记录下当前最大数的索引,然后与未排序的最后一个元素互换位置。def selection_sort(list): for i in range(len(list)): max_index = 0 for j in range(0,len(list)-i): if list[max_index] < list[j]: max_index = j list[max_index],list[len(list)-i-1] = li原创 2020-07-08 21:30:06 · 77 阅读 · 0 评论 -
输出合法括号组合
题目给定一个n,要求输出所有的n对括号的组合。如n=2(()),()(),思路合法的括号,肯定是先(,后),所以就有一个搜索路径,搜索到底后,在回溯,继续搜索。def match_kh(n,perfix,result): left = n right = n rec_match(left,right,perfix,result) print(result) return resultdef rec_match(left,right,perfix,result): if原创 2020-07-07 20:53:15 · 178 阅读 · 0 评论 -
求目标和子集
题目给定一个集合,和目标数,求出所有子集的相加等与目标数的子集。set= [1,3,4,5],target = 8思路先遍历每一个元素,,将没有用到的元素和这个元素组合,看看是否等于目标数,组合完了之后,在回溯到初始状态,进行下一个元素。代码def sum(set,target): result = [] list = [] permutation_sum(set,result,list,target,0) print(result) return resultdef p原创 2020-07-07 18:34:22 · 213 阅读 · 0 评论 -
排列组合取n个
题目给定一个集合,取其排列组合的其中n个思路对集合做全排列,然后取其中n个代码def permutation_n(set,result,n): if n == 0: print(result) return result for i in range(len(set)): permutation_n(set[:i]+set[i+1:],result+set[i],n-1)set = ['1','2','3']permutation_n(set,'',2).原创 2020-07-07 16:51:19 · 128 阅读 · 0 评论 -
唯一排列
题目如一个集合[3,2,3],求其不重复的排列集合。思路先对集合做一个排序,然后剪枝,判断前后的字符串是否一致。代码def permutation_unique(set,result): set.sort() if len(set)==0: print(result) return result for i in range(len(set)): if i!=0 and set[i]==set[i-1]: continue permutati原创 2020-07-07 16:35:07 · 115 阅读 · 0 评论 -
输出subset
题目给一个集合,输出他的所有子集如{‘a’,‘b’,‘c’}---->{所有子集}思路用回溯法,每次取一个字符串,利用其它的字符串组合,然后在回溯到初始状态,进行下一个。代码def subset(set): list = [] result = [] subset_back(set,list,result,0) return resultdef subset_back(set,list,result,pos): result.append([list[:]])原创 2020-07-06 14:17:43 · 125 阅读 · 0 评论 -
格雷码
题目0000000100110010011001110101010011001101.。。。思路刚开始构建一个只有0,1字符串的列表,我们发现格雷码是有规律的,前两个左边加0,而后两个是逆序左边加1.def gray_code(n): if n == 1: return ['0','1'] a = ['0'+ i for i in gray_code(n-1)] b = ['1'+ i for i in gray_code(n-1)[::-1]] retu原创 2020-07-06 13:38:40 · 113 阅读 · 0 评论 -
汉诺塔
题目有三个立柱A、B、C。A柱上穿有大小不等的圆盘N个,较大的圆盘在下,较小的圆盘在上。要求把A柱上的圆盘全部移到C柱上,保持大盘在下、小盘在上的规律(可借助B柱)。每次移动只能把一个柱子最上面的圆盘移到另一个柱子的最上面。请输出移动过程。思路假设有两个盘子,我们先把最上面的盘子移到B(A–B),然后把最下面的盘子移到C(A–C),然后把最小的盘子移到中间盘子上面(B–C)。假如有三个盘子ABC,我们先把最上面的盘子移到C(A–C),然后把中间的盘子移到B(A–B),然后把最小的盘子移到中间盘子上面原创 2020-07-05 13:29:04 · 3016 阅读 · 0 评论 -
数学表达式
题目只做+1或者2操作,使得给定一个目标数,一个初始数,使得初始数到目标数的步骤最短。23 = ((52+1)2+1)113 = ((((11+1)+1)+1)222+1)思路先判断目标数字和原始数字的大小,,然后在判断目标数是否为奇数,若是,则-1变成偶数在递归,在判断原始数*2是否大于目标数,若不大于,则做乘2的操作。若小于则不能做乘2操作,出口条件为当target = original代码def math_seq(target,original): if target<orig原创 2020-07-05 13:09:13 · 321 阅读 · 0 评论 -
打印尺子
题目11211213121121312141213121.。。。。思路n = 1时,f(n)= 1n = n时,f(n) = f(n-1)+ n +f(n-1)代码def print_rule(n): if n == 1: return '1' else: t = print_rule(n-1) return t+ ' ' + str(n) + ' '+ tprint_rule(3)到这就结束了吗?并没有打印出尺子。def print_line(l原创 2020-07-05 12:44:04 · 1027 阅读 · 0 评论 -
斐波那契数列
题目1 1 2 3 5 8 13.。。。。思路f(0) = 1f(1) = 1f(n) = f(n-1) + f(n-2)代码def fibonacci(n): if n == 1: return 1 if n == 2: return 1 else: return fibonacci(n-1) + fibonacci(n-2)fibonacci(10)原创 2020-07-05 12:13:45 · 103 阅读 · 0 评论