递归[DFS/BFS]
Czy_whlg
不忘本心!
展开
-
Print Binary Tree
Print a binary tree in an m*n 2D string array following these rules:The row numbermshould be equal to the height of the given binary tree. The column numbernshould always be an odd number. The...原创 2020-03-13 22:44:39 · 138 阅读 · 0 评论 -
Find Duplicate Subtrees
Find Duplicate SubtreesGiven a binary tree, return all duplicate subtrees. For each kind of duplicate subtrees, you only need to return the root node of anyoneof them.Two trees are duplicate if ...原创 2020-03-11 23:26:53 · 170 阅读 · 0 评论 -
Shopping Offers
1.解析题目大意,给定每个商品的价值和优惠券(优惠券可以重复使用),求解所购买商品最少花多少钱。2.分析我最初看到这道题的时候,求最值,以为是DP,但在设计的过程中,发现有个问题,就是所取到的值并不是局部的最优解,因为不单要考虑优惠券,而且还要考虑无法使用优惠券的那部分的钱,所以不是DP。参考@Grandyang博主的思路,发现其实采用深度优先检索是最简便的,利用一个临时变量...原创 2020-03-05 21:09:42 · 231 阅读 · 0 评论 -
01 Matrix
1.解析题目大意,求解矩阵中每个位置和离它最近的0之间的距离。2.分析我刚开始想到的是DFS,但我没有去实现,参考Grandyang的思路。其实,求距离用BFS是比较合理的,像经典的迷宫问题,都是从一端探索到另外一端。而这里,是有多个入口的。题目求解矩阵中'1'所处的位置跟离它最近的0之间的距离,所以我们以每个0所处的位置作为需要探索的起点,放在队列当中;若矩阵中的元素值...原创 2020-02-17 21:58:35 · 196 阅读 · 0 评论 -
Target Sum
class Solution {public: int findTargetSumWays(vector<int>& nums, int S) { vector<unordered_map<int, int>> res(nums.size()); return DFS(nums, S, 0, res);...原创 2020-02-15 21:25:41 · 146 阅读 · 0 评论 -
Matchsticks to Square
1.解析题目大意,数组中的所有元素是否可以组成正方形?2. 解析这道题本质上和Partition Equal Subset Sum是一样的,这里是求解数组元素组成4个相等的数,首先,如果数组所有元素的和不能整除4,那肯定不满足条件。这里要注意的一点是,让数组从大到小进行排列,主要是为了避免重复扫描小的元素。不然无法OJ。class Solution {public: ...原创 2020-01-12 10:40:57 · 237 阅读 · 0 评论 -
Delete Node in a BST
1. 解析题目大意,删除二叉排序树中指定的key值的节点。2. 分析这题我没写出来,思路是有的,参考了@Grandyang的博客。我主要卡在了当删除结点存在左右子树的情况,对于删除的结点会存在以下3种情况:①删除结点的左子树和右子树为空,则直接令删除节点为NULL即可②删除结点的左子树为空或者右子树为空,将删除结点的左子树或者右子树替换掉删除节点即可③删除结点的左右...原创 2019-12-26 19:51:47 · 139 阅读 · 0 评论 -
Minimum Genetic Mutation
1. 解析题目大意,给定基因序列start和end,判断是否能从start序列经过基因突变变成end序列?如果可以,返回所经过的最小次数。一次基因突变只改变其中的一个字母。2. 分析刚开始看到这题,觉得好熟悉,似乎之前做过,不过我没想起来,我采用了比较直接的方法。首先,可以确定的是,如果经过能基因突变成end,那么end一定会在bank数组当中,所以,第一步先判断end是否存在数...原创 2019-12-22 12:02:52 · 168 阅读 · 0 评论 -
Pacific Atlantic Water Flow
1. 解析题目大意,找出能同时流向太平洋和印度洋的区域,太平洋区域为左边和上边,印度洋区域为右边和下边。只有当前区域高度大于或等于相邻区域高度才能流向该区域2. 分析刚开始看到这题,我第一反映就是Surrounded Regions,但这里最大的不同在于有两个区域,而不是仅仅只有一个区域,最初我以为要设计两个递归函数,一个检测是否能流向太平洋,另外一个检测是否能流向印度洋,但感觉...原创 2019-12-17 19:29:53 · 183 阅读 · 0 评论 -
Integer Replacement
1. 解析题目大意, 输入一个正整数,按照一定的步骤将其缩小为1,如果当前为偶数,则折半;如果当前的奇数,将其加1或者减1,求解缩小为1所经过的最少步骤。2. 分析如果当前数为偶数,折半即可,若为奇数,可以做两种不同的操作,要么减1要么加1;很明显我们要一直往下搜索目标,由于还存在不同的选择,故需要回溯到之前的状态,用深搜DFS无非是最合适的。如果n = INT_MAX,则n+1会...原创 2019-12-13 17:12:05 · 165 阅读 · 0 评论 -
Reconstruct Itinerary
1. 解析题目大意,求解从"JFK"开始的旅程路线,如果存在一个起点多个终点,选择字母排序最靠前的终点2. 分析参考@Grandyang思路,将题目抽象出来,整个飞机的航程就是有向图,依次遍历边,直到终点。因为飞机的航程可能会重复,所以利用multiset存储,另外multiset的顺序默认是有序的,这样我们就不必考虑多个终点选择那个哪个的问题。有向图的遍历问题还是比较简单的,详...原创 2019-12-06 21:36:12 · 141 阅读 · 0 评论 -
Super Pow
1. 解析题目大意,求解a的b次方,b是一个很大的数,用数组存储2. 分析我刚开始想到的解法是将b进行拆解,例如,先记录当前的余数res,然后位数往前移的时候,表示有10个数,所以res要重复乘以10次,如果当前为是0,那当前的余数就是上一个的余数,计算次方,利用库函数pow进行计算,但没有考虑到溢出的情况,例如上一个的余数是1024,那下一次计算余数就是1024的10次方,肯定...原创 2019-12-04 17:39:44 · 177 阅读 · 0 评论 -
House Robber III
1. 解析题目大意,求解二叉树所有非相邻节点和的最大值。题目还是很难的,就是会给人一种有思路,但就是写不出来的感觉,要求对递归理解非常透彻才有可能设计出来。2. 分析参考@Grandyang的解法,主要分成两种情况考虑:①考虑根节点的值,不考虑左右子树的根节点②不考虑根节点的值,考虑左右子树的根节点综上,为了不重复的检索,我们可以借助hashtable存储检索过的节点...原创 2019-11-28 19:53:05 · 140 阅读 · 0 评论 -
Additive Number
1. 解析题目大意,判断所给定的字符串是否可以划分为前2个数字之和等于第3个,由于每个数是不确定长度的,很明显利用DFS更合理,但如何设计终止条件是一个难点。我认为这道题提供了很好的解决思路,不知道是不是我DFS理解的水平太低了,我就没有想出来~~~2. 分析res——是否存在已经划分好的结果,nums——记录已经划分好的数,start——当前数的在字符串的起始位置①题目已...原创 2019-11-23 12:13:31 · 137 阅读 · 0 评论 -
Add and Search Word - Data structure design
1. 解析题目大意,建立对应的字典树结构,查找所给的单词是否存在字典树当中,'.'可以匹配26个字母当中的任何一个。2. 分析本题的难点在于'.'的处理,它可以任意匹配26个字母当中的任何一个,很明显利用深度优先检索是最合适的,当匹配到'.'时,对当前指针任意取一个非空指针,代表当前位置上的字母已经出现,继续往下搜索,若不能满足条件,再回溯到当前指针,继续搜索下一个非空指针,.....原创 2019-11-22 20:03:48 · 141 阅读 · 0 评论 -
Perfect Squares
1. 解析题目大意,将正整数拆分成多个正整数的平方,求解可以拆分的最小个数2. 分析我刚开始想到的是,用递归取求解,然而,时间超限,不过也很正常。本题所考察的核心是四平方和定理,即任意一个正整数最多可以拆分成4个正整数的平方,如果当前所拆分的正整数n为4的倍数,那么该正整数所分解结果的个数与n/4的结果一样,很容易证明,例如(a^2 + b^2 + c^2) = n,则 4n = ...原创 2019-11-20 20:41:48 · 253 阅读 · 0 评论 -
Word Search
1. 解析题目大意,给定单词,在所给定的字符数组中查找是否存在该单词。是比较经典的迷宫算法题型2. 分析此类题型就是直接用DFS就可以,注意判断边界条件class Solution {public: bool exist(vector<vector<char>>& board, string word) { if ...原创 2019-11-12 09:33:38 · 134 阅读 · 0 评论 -
Subsets II
1. 解析题目大意,返回数组的子集,不能出现重复出现的子集。难点在于如何过滤掉重复的元素2. 分析用size表示上一个子集的个数,newsize表示当前子集的个数,因为当前res结果存储的子集是上一个子集的基础上添加的,例如 size = 1, res = [ [], [1] ] ;size = 2, res = [[], [1], [2], [1, 2] ];所以我们...原创 2019-11-12 09:26:12 · 107 阅读 · 0 评论 -
Number of Islands
1. 解析这道题和之前的Surrounded Regions思路是一样的,比它稍微简单一些class Solution {public: int numIslands(vector<vector<char>>& grid) { int island = 0; for (int row = 0; row <...原创 2019-11-07 16:50:08 · 121 阅读 · 0 评论 -
递归使用模板总结
1.递归简介在许多问题上面,递归算法可以帮组我们快速高效地解决问题,例如涉及树、棋盘、迷宫、排列、组合、子串等问题,每一类问题都可以体现出相同的一种规律。递归的关键在于设置合适的终止条件,这得需要大量经验的积累,我也是在不断学习~2.模板2.1 深搜的索引取(pos+1)依次遍历的顺序如下(从上至下,从左至右):关键就在于DFS(res, pos+1),pos位置的变化会导致不...原创 2019-11-06 16:00:41 · 353 阅读 · 0 评论 -
Surrounded Regions
1. 解析题目大意,将被'X'包围的所有'O'替换成'X',类似于下围棋.是比较经典的分治法,只要类似于棋盘的题目,大多数都会涉及到深度优先检索,分治法和深度优先检索是一对孪生兄弟,不分彼此2. 分析观察棋盘我们可以知道,如果当前的'O'不被'X'所包围,那么当前的'X'极有可能就是处于边缘的位置,如果不处于边缘的位置,不是很容易判断当前的状态是否被包围,棋盘无非只有上下左右四个方...原创 2019-11-04 17:16:46 · 159 阅读 · 0 评论 -
Combination Sum II
1 解析这道题是则就是上一道题的进阶版,此题可以出现相同的元素,例如[1 1 1 7] 目标值为8,那么难点就在于如何去除重复的情况,只保留[1 7]这种情况.2 思路都是采用DFS求解,思路和上一题没什么区别,主要在于如何解决重复元素的问题,通常都采用这种模型去重,即先将数组进行排序,搜索的时候,每次将当前元素和上一个元素进行比较,若相同,往下搜索下一个元素,为了防止将第一次...原创 2019-11-02 18:21:16 · 104 阅读 · 0 评论 -
Combination Sum
1 解析这道题整体不是很难,也是比较典型的DFS2 分析按照我们正常的思路,我们依次选择的顺序为[2 2 2 2]——>[2 2 2 3]——>[2 2 2 6]——>[2 2 2 7]——>[2 2 3]......——>[7],观察可以发现实际上就是不断往下搜索,然后回溯的过程3 实现1.先将当前元素排序(目的:为了快速地判断当前状态是否终...原创 2019-11-02 17:57:10 · 249 阅读 · 0 评论 -
Word Break
解析 :题意:单词划分,将字符串分解成多个单词,每个单词都要出现在字典当中,如果存在,返回true,否则返回false分析:本题并没有要求我们将每一种满足划分条件的列出来,只需要找到一种情况即可。要保证划分后的每一个单词都要出现在字典当中,即意味着后面划分的单词一定是基于****前面划分的单词基础之上,即下一个状态依赖于上一个状态,可以利用动态规划进行求解,同时也可以采用带记忆状态的DFS进...原创 2019-10-30 18:28:33 · 169 阅读 · 0 评论 -
Convert Sorted List to Binary Search Tree
解析:这道题本身不难,在二叉排序树的基础上,要求左右子树的深度差小于或等于1,即构建平衡二叉树分析:设计快慢指针,快指针每次走两步,慢指针每次走一步,根据快慢指针分为两段链表,从head节点至slow节点这段为左子树,slow->next节点至尾结点为右子树,slow指针指向的节点即为根节点,依次重复该过程即可保证左右子树的绝对高度差的绝对值小于或等于1/** * Definitio...原创 2019-10-29 19:33:52 · 116 阅读 · 0 评论 -
Word Ladder
解析:这道题还是比较难的,我第一次看没有什么思路,实则考察的核心是广度优先检索分析:由于每个单词都是由26个字母组成,即意味着变换下一个单词就是从其它25个字母当中选择其中一个(本身重复的不计在内),单词的每一个位置都是如此,有点类似于走迷宫,只不过迷宫每次只有上下左右四个方向进行选择,但本质上还是一样的,所有可以采用广度优先检索去一层一层检索,直到最终目标出现,或走到头.用队列allWor...原创 2019-10-29 17:28:32 · 215 阅读 · 0 评论 -
Unique Binary Search Trees II
解析:建立二叉排序树,整体上还是比较难,是本题的进阶具体递归整个过程还是比较难理解,以后再完善,整体思路如下:1.分别获取左节点和右节点的值,存储在vector数组当中2.创建根节点,将根节点的左指针指向左节点,右指针指向右节点/** * Definition for a binary tree node. * struct TreeNode { * int ...原创 2019-10-28 17:28:34 · 122 阅读 · 0 评论 -
Generate Parentheses
解析:这题不是很好想,反正我刚开始看题没什么思路关键:n对括号:一定是n个’(‘和n个’)'括号我们可以从这个突破点出发,利用递归的解法,左边先填充左括号,然后在右边填充右括号终止条件:剩下左括号的个数大于右括号的个数,那么不可能匹配例如n=3,填充的顺序依次为:class Solution {public: vector<string> generatePar...原创 2019-10-24 19:18:55 · 122 阅读 · 0 评论 -
Populating Next Right Pointers in Each Node
解析:本题实则考察的是层次遍历算法将队列作为保存节点的结构,并将NULL指针作为每一层节点的结束符1.将头节点入队列,并将NULL指针作为第一层的结束符2.遍历当前层的节点,并将其左右非空节点入队列,将其节点的next指针指向队列的下一个节点(右边的节点),直到节点为NULL,即当层节点遍历完3.依次对每一层节点执行上面的步骤关键:1.每层节点的结束标识为NULL2.遍历完本层节点...原创 2019-10-23 17:32:49 · 168 阅读 · 0 评论 -
Flatten Binary Tree to Linked List
解析:将二叉树平铺成list链表的形式第一种解法:1.利用先序遍历,将每个节点的值保存在res数组当中2.根据res数组中的值重新创建一个新的链表形式的二叉树,将其赋给root节点优点:无需对指针进行复杂的操作缺点:容易想到,当要花费大量的额外空间,然而递归的方法我无法设计出来,哎~~~~/** * Definition for a binary tree node. * str...原创 2019-10-22 17:31:43 · 246 阅读 · 0 评论 -
Construct Binary Tree from Preorder and Inorder Traversal
解析: 思路类似根据中序和后序确定二叉树/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(N...原创 2019-10-21 17:29:00 · 105 阅读 · 0 评论 -
Construct Binary Tree from Inorder and Postorder Traversal
解析:明显的递归类型题目,与前序遍历和中序遍历确定二叉树思路是一样的后序遍历: 左 右 根中序遍历: 左 根 右1.根据后序遍历中的最后一个元素在中序遍历中确定根节点的位置,区分左右子树2.建立当前节点的指针,并将该指针的左指针left指向左子树,右指针right指向右子树利用i表示根节点的下标,ileft表示中序遍历的起点,iright表示中序遍历的终点,pleft表示后序遍历的起...原创 2019-10-21 17:23:12 · 104 阅读 · 0 评论 -
Validate Binary Search Tree
解析:主要考察二叉排序树的一条主要的性质:二叉排序树中序遍历结果是递增的直接采用中序遍历依次取到各个节点的值,如果当前节点的值小于上一个节点的值,则不是递增的序列,即二叉树不是二叉排序树注意:节点保存的值可能为-2147483648,即int整形数据的临界值,为保证临时变量的值要比整形临界最小值要小,临时变量的类型声明为long int型/** * Definition for a b...原创 2019-10-19 12:41:06 · 122 阅读 · 0 评论 -
Restore IP Addresses
解析:一般求解组合或排列,都是递归的思想1.将IP地址分为4端来看待,每一段的位数至少为1,且不能大于32.依次将每一段的位数递增1-3,检测是否符合IP地址的要求,即每一段要<=255特殊情况的处理:1.等于0,位数不能超过1,即出现连续的’0’就不满足要求2.'0’开头,则位数不能大于1class Solution {public: vector<strin...原创 2019-10-18 17:46:06 · 156 阅读 · 0 评论