递归
LeetCode刷题分类——递归
阿清~
这个作者很懒,什么都没留下…
展开
-
《剑指offer》刷题系列——(七十)字符串的排列
题目输入一个字符串,打印出该字符串中字符的所有排列。你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。示例:输入:s = “abc”输出:[“abc”,“acb”,“bac”,“bca”,“cab”,“cba”]思路求整个字符串的排列,可以看成两步:第一步是求所有可能出现在第一个位置的字符,即把第一个字符与后面所有的字符交换;第二步是固定第一个字符,求后面所有字符的排列。(第二步中求后面字符的排列依然是使用这两步的方法,也就是递归实现。)c[x]表示当前固定位。代码clas原创 2020-07-27 12:04:34 · 91 阅读 · 0 评论 -
《剑指offer》刷题系列——(六十五)二叉搜索树的后序遍历序列
题目思路代码class Solution: def verifyPostorder(self, postorder: List[int]) -> bool: if not postorder: return True root = postorder[-1] left = 0 while left<len(postorder)-1: if postorder[left]>原创 2020-07-25 10:03:22 · 98 阅读 · 0 评论 -
《剑指offer》刷题系列——(六十四)二叉搜索树与双向链表
题目输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。思路要求转换之后的链表是排好序的,而根据二叉搜索树的特点,使用中序遍历,可以按照从小到大的顺序访问二叉树的每个节点。在二叉树中,每个节点都有两个指向子节点的指针。在双向链表中,每个几点也有两个指针,分别指向前一个节点和后一个节点。两者之间有相似之处,如果能将二叉搜索树中原本指向左子节点的指针调整为链表中指向前一个节点的指针,原本指向右子节点的指针调整为链表中指向后一个节点的指针,原创 2020-07-23 21:37:12 · 68 阅读 · 0 评论 -
《剑指offer》刷题系列——(五十八)最小的k个数
题目输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。示例 :输入:arr = [3,2,1], k = 2输出:[1,2] 或者 [2,1]思路一、利用快速排序的思想。快速排序的partition函数每次返回一个索引值index,一次排序之后,index左边的数都小于index位置上的数。因此当我们返回index值时,就将它与k-1值比较,如果刚好等于k-1,则直接输出arr数组的前k个元素(索引为0到k-原创 2020-07-20 16:16:49 · 110 阅读 · 0 评论 -
《剑指offer》刷题系列——(五十七)机器人的运动范围
题目地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。请问该机器人能够到达多少个格子?示例 :输入:m = 2, n = 3, k = 1输出:3思路本题与 矩阵中的路径 题原创 2020-07-20 11:04:42 · 84 阅读 · 0 评论 -
《剑指offer》刷题系列——(五十五)求1+2+…+n
题目求 1+2+…+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。输入: n = 3输出: 6思路以逻辑运算符 && 为例,对于 A && B 这个表达式,如果 A 表达式返回 False ,那么 A && B 已经确定为 False ,此时不会去执行表达式 B。同理,对于逻辑运算符 ||, 对于 A || B 这个表达式,如果 A 表达式返回 True ,那么 A || B原创 2020-07-19 13:44:57 · 107 阅读 · 0 评论 -
《剑指offer》刷题系列——(四十一)矩阵中的路径
题目请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。例如,在下面的3×4的矩阵中包含一条字符串“bfce”的路径(路径中的字母用加粗标出)。[[“a”,“b”,“c”,“e”],[“s”,“f”,“c”,“s”],[“a”,“d”,“e”,“e”]]但矩阵中不包含字符串“abfb”的路径,因为字符串的第一个字符b占据了矩阵中的第一行第原创 2020-07-13 14:45:57 · 133 阅读 · 0 评论 -
《剑指offer》刷题系列——(三十二)斐波那契数列
题目写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项。斐波那契数列的定义如下:F(0) = 0, F(1) = 1F(N) = F(N - 1) + F(N - 2), 其中 N > 1.斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。思路这个题最容易想到的是递归,但是会产生大量重复计算,出现超时。最好的方法是无论给出的n等于几原创 2020-07-10 16:45:42 · 171 阅读 · 0 评论 -
《剑指offer》刷题系列——(三十一) 树的子结构
题目输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)B是A的子结构, 即 A中有出现和B相同的结构和节点值。思路遇到这个题,我们的比较思路是,从A的根节点开始,寻找与B的根节点值相同的节点,如果找到了,那么这个节点作为根节点形成的树就有可能包含B的结构。当我们找到这个可能的节点,再将它的结构与B进行比较。我们需要完成两个过程,分别定义在两个函数中,一个是在A中查找可能包含B的子结构isSubStructure(),另一个是比较该子结构与B树是否含有相同的结构com原创 2020-07-10 16:09:45 · 102 阅读 · 0 评论 -
《剑指offer》刷题系列——(三十) 二叉树的最近公共祖先
题目给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。思路我们首先能想到的是,当以root为根节点进行查找时,如果p或者q刚好等于root,那么p和q的最近公共祖先就是root。那如果p或者q都不等于root怎么办呢?这种情况下就是要从root的左右子树中寻找p和q。运用递归思路。整个递归过程实际是查找root的左右子树中是否有p和q节点,查找结果分为下面四种情况:如果左右子树中都找不到p和q。就返回空;如果左子树找不到,右子树能找到,就返回右子树的查找结果;如果左子树能找到,原创 2020-07-09 14:32:02 · 105 阅读 · 0 评论 -
《剑指offer》刷题系列——(二十九)二叉搜索树的最近公共祖先
题目给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。思路树为二叉搜索树 ,树的所有节点的值都是唯一 的,且满足左子树的值都小于根节点的值,右子树的值都大于根节点的值。对于p和q的位置关系有以下几种情况:如果p的值等于root或者q的值等于root,那么p和q的最近公共祖先是root;如果p和q位于位于root的异侧,则p和q的最近公共祖先就是root;如果p和q位于位于root的同侧,就从p和q所在的一侧开始递归查找。代码# Definition for a binary t原创 2020-07-09 11:27:40 · 119 阅读 · 0 评论 -
《剑指offer》刷题系列——(二十八) 平衡二叉树
题目输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。思路在上一题求 二叉树的深度 中,我们已经掌握了求一棵树深度的方法,因此本题可以利用求深度的方法,判断树中每个节点的左右子树的深度差是否不超过1。代码# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x#原创 2020-07-09 10:43:52 · 104 阅读 · 0 评论 -
《剑指offer》刷题系列——(二十七) 二叉树的深度
题目输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。思路二叉树的深度要包含根节点,根节点的深度为1。所以二叉树的深度为左右子树深度的最大值加1。利用递归实现。如果根节点为空,深度为0。代码# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x#原创 2020-07-08 11:00:15 · 89 阅读 · 0 评论 -
《剑指offer》刷题系列——(二十六) 二叉搜索树的第k大节点
题目给定一棵二叉搜索树,请找出其中第k大的节点。思路二叉搜索树,也叫二叉排序树、二叉查找树,它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉搜索树。要找出树所有节点中的第K大值,最好的方法是能将树中所有节点进行排序,然后就很容易找到第K大的数。根据二叉搜索树的特点,如果对树进行中序遍历,则能得到所有节点的递增序列,中序遍历的过程是,先访问左子树原创 2020-07-08 10:24:30 · 87 阅读 · 0 评论 -
《剑指offer》刷题系列——(二十一) 对称的二叉树
题目请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。例如,二叉树 [1,2,2,3,4,4,3] 是对称的。但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:思路如果一个树是对称的,那么它的左子树和右子树是镜像对称。两个树互为镜像的条件:(1)根节点的值相同;(2)一个树的左子树与另一个树的右子树镜像对称。采用递归的方法依次比较一个树的左子树和另一个树的右子树是否镜像。递归的结束条件:当两个树根节点的值都为空,原创 2020-07-06 14:04:57 · 73 阅读 · 0 评论 -
《剑指offer》刷题系列——(二十) 二叉树的镜像
题目请完成一个函数,输入一个二叉树,该函数输出它的镜像。输入:root = [4,2,7,1,3,6,9]输出:[4,7,2,9,6,3,1]思路采用递归的思想。镜像就是交换每个节点的左右子树。代码# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self原创 2020-07-06 09:37:30 · 96 阅读 · 0 评论