DFS
文章平均质量分 70
努力努力再努力r
这个作者很懒,什么都没留下…
展开
-
(M)DFS:207. Course Schedule
建立有向图,用二维数组来建立,需要一个一维数组visit来记录访问状态,这里有三种状态,0表示还未访问过,1表示已经访问了,-1表示有冲突。大体思路是,先建立好有向图,然后从第一个门课开始,找其可构成哪门课,暂时将当前课程标记为已访问,然后对新得到的课程调用DFS递归,直到出现新的课程已经访问过了,则返回false,没有冲突的话返回true,然后把标记为已访问的课程改为未访问。 class So原创 2017-10-16 22:41:03 · 213 阅读 · 0 评论 -
(M)DFS: 547. Friend Circles
这个题以前做过,用的是并查集,这次选择用DFS。我开辟了一个新的数组,长度为n,表示第i个人的直系关系有没有找过。 class Solution { public: int findCircleNum(vector>& M) { int n = M.size(); vector ischeck(n, 0); int count = 0;原创 2017-10-14 16:56:10 · 229 阅读 · 0 评论 -
(M)DFS: 337. House Robber III
DFS,给每个结点增加一个两元素的数组。res[0] 表示不加上当前结点值的最大值,res[1] 表示加上当前结点值的最大值。那么对于 res[0] 来说,其值等于子结点数组元素的较大值,因为此时可以加上子结点,也可以不加上子结点,选其中较大值。但是对于 res[1] 来说,就不行了,因为加上当前结点值的时候,必须不能加上子结点的值,否则警报会响,因此,只能算上子结点的 res[0]。 /**原创 2017-10-14 18:03:18 · 233 阅读 · 0 评论 -
(M)DFS: 638. Shopping Offers
这道题说有一些商品,各自有不同的价格,然后给我们了一些优惠券,可以在优惠的价格买各种商品若干个,要求我们每个商品要买特定的个数,问我们使用优惠券能少花多少钱,注意优惠券可以重复使用,而且商品不能多买。那么我们可以先求出不使用任何商品需要花的钱数作为结果res的初始值,然后我们遍历每一个coupon,然后遍历每一个商品,如果某个商品需要的个数小于coupon中提供的个数,说明当前coupon不可用。原创 2017-10-14 19:03:19 · 201 阅读 · 0 评论 -
(M)DFS: 394. Decode String
好久都没做出来,看大神代码: class Solution { public: string decodeString(const string& s, int& i) { string res; while (i < s.length() && s[i] != ']') { if (!isdigit(s[i]))原创 2017-10-14 22:55:52 · 179 阅读 · 0 评论 -
(M)DFS:491. Increasing Subsequences
大神解法: class Solution { public: vector> findSubsequences(vector& nums) { set> res; vector> cur(1); for (int i = 0; i < nums.size(); ++i) { int n = cur.size();原创 2017-10-15 11:10:30 · 164 阅读 · 0 评论 -
(M)DFS:129. Sum Root to Leaf Numbers
这道题的意思是,给一个二叉树,每一条从根到叶的路径都表示一个数字,问所有路径表示的数字加起来的和是多少。 我的思路是,用一个vector记录这条路径上的所有数,如果一个节点左右子树都为空,则把vector里的数字转换成一个数,加到sum里 /** * Definition for a binary tree node. * struct TreeNode { * int va原创 2017-10-15 13:02:54 · 141 阅读 · 0 评论 -
(M)DFS:116. Populating Next Right Pointers in Each Node
这道题的意思是,给一个二叉树,填充每一个节点的next指针,next指针指向这个节点右侧的节点。 我的做法是,观察给出的例子,遍历这棵树的每一个节点node,如果node->left不为空,那么left的next只能是他父节点的右子树,如果node->right不为空,就看node->next。如果node->next为空,说明node是左右边的节点,则node->right的next肯定是nu原创 2017-10-15 14:21:13 · 156 阅读 · 0 评论 -
(M)DFS:114. Flatten Binary Tree to Linked List
这道题的意思是,把一个二叉树展开成一个链。 参考了大神的做法: 把左子树展开成链,把右子树展开成链,然后让右子树变成展开后的左子树,遍历到树的最下端,把展开成的右子树加在这个最下端。 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; *原创 2017-10-15 15:10:29 · 155 阅读 · 0 评论 -
(M)DFS:200. Number of Islands
这个题的意思是求岛屿的个数。给出一个由0和1构成的表格,一个岛屿是一个1和他们相邻的1构成,并且一个岛屿周围都是0,问岛屿的个数。 我的做法是新开辟了一个同样大小的表格记录这个位置是否已经查看过。如果一个位置没有被查看过并且在给出的表格里值为1,那么对这个位置上下左右的相邻位置上进行dfs递归查找。 class Solution { public: int numIslands(vec原创 2017-10-15 16:54:22 · 239 阅读 · 0 评论 -
(M)DFS:109. Convert Sorted List to Binary Search Tree
这道题的意思是,给一个排序过的单链表,把这个单链表转变成一棵二叉搜索树。 这道题的关键在于,怎样找到单链表的中间那个节点。经典的方法是使用快慢指针,也就是每次让快指针走两步,让慢指针走一步,这样当快指针走到末尾的时候,慢指针指的就是链表的中间节点。然后把链表分成了两部分,左右两部分分别dfs /** * Definition for singly-linked list. * struct原创 2017-10-15 17:52:18 · 159 阅读 · 0 评论 -
(M)DFS:113. Path Sum II
这个题是给出一个二叉树,再给一个目标值target,求出所有从根到叶,并且这个路径的和等于这个目标值的所有路径。 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(原创 2017-10-15 19:50:28 · 154 阅读 · 0 评论 -
(M)DFS:105. Construct Binary Tree from Preorder and Inorder Traversal
这道题的意思是,根据树的先序遍历和中序遍历的结果,构建这棵树。 由于先序的顺序的第一个肯定是根,所以原二叉树的根节点可以知道,题目中给了一个很关键的条件就是树中没有相同元素,有了这个条件我们就可以在中序遍历中也定位出根节点的位置,并以根节点的位置将中序遍历拆分为左右两个部分,分别对其递归调用原函数。 /** * Definition for a binary tree node. * st原创 2017-10-16 21:49:11 · 210 阅读 · 0 评论 -
(M)DFS: 106. Construct Binary Tree from Inorder and Postorder Traversal
后序的顺序的最后一个肯定是根,所以原二叉树的根节点可以知道,题目中给了一个很关键的条件就是树中没有相同元素,有了这个条件我们就可以在中序遍历中也定位出根节点的位置,并以根节点的位置将中序遍历拆分为左右两个部分,分别对其递归调用原函数。 /** * Definition for a binary tree node. * struct TreeNode { * int val; *原创 2017-10-16 23:07:37 · 156 阅读 · 0 评论 -
(M)DFS:332. Reconstruct Itinerary
参考大神博客: 这道题给我们一堆飞机票,让我们建立一个行程单,如果有多种方法,取其中字母顺序小的那种方法。这道题的本质是有向图的遍历问题,本题是关于有向图的边的遍历。每张机票都是有向图的一条边,我们需要找出一条经过所有边的路径,那么DFS不是我们的不二选择。先来看递归的结果,我们首先把图建立起来,通过邻接链表来建立。由于题目要求解法按字母顺序小的,那么我们考虑用multiset,可以自动排序。等原创 2017-10-17 10:09:04 · 209 阅读 · 0 评论 -
(M)DFS:98. Validate Binary Search Tree
这道题要想到每次代入最大值和最小值 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NU原创 2017-10-17 15:48:56 · 163 阅读 · 0 评论 -
(M)DFS:529. Minesweeper
扫雷游戏。 给定2维字符矩阵board,'M'表示未挖到的地雷,'E'表示未挖到的空地。'B'表示已经挖到的、四周(上下左右以及对角线)没有地雷的空地。数字'1'到'8'表示四周包含相应数字的地雷,'X'表示挖到地雷。 给定下一次鼠标点击的位置(只在'M'或者'E'处点击),根据如下规则返回点击之后的board: 如果挖到'M',则将其变成'X',游戏结束 如果挖到四周没有地雷的'E',将原创 2017-10-14 15:39:20 · 241 阅读 · 0 评论 -
(M)DFS:515. Find Largest Value in Each Tree Row
这道题的意思是,存下一棵二叉树每一行最大的数。 我的做法是,遍历这棵树,用一个变量depth记录当前的深度,看当前遍历到的这个结点是不是比当前深度下的最大值大,大的话就替换掉当前深度下的最大值。 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left原创 2017-10-14 14:23:23 · 179 阅读 · 0 评论 -
(M)DFS:513. Find Bottom Left Tree Value
这道题意思是求一棵树最左下角的数是多少。 我的思路是,最左下角是哪个数与深度有关系,所以我设了两个变量,记录当前最大的深度,和当前最大深度下最左边的数是多少。然后遍历这棵树,如果当前深度大于当前最大深度,说明出现了新的左下角的数字,更新这两个变量。如果不大于当前深度的话就不更新,继续往左子树遍历,左边走到底,然后再遍历右子树。 /** * Definition for a binary tr原创 2017-10-14 14:10:59 · 160 阅读 · 0 评论 -
(M)DFS:210. Course Schedule II
这道题考察拓扑排序。 思路是依次输出入度为0的节点。入度为0表示没有可以构成他的其他节点,但是他可以构成别人,所以这门课要先选。首先把图中所有的入度为0的节点压栈,然后依次弹出一个节点,把这个节点所连的节点的入度依次减1,如果减1之后入度为0,压栈。如此循环,直到栈为空。 class Solution { public: vector findOrder(int numCourses,原创 2017-10-17 21:15:03 · 203 阅读 · 0 评论 -
(M)DFS:417. Pacific Atlantic Water Flow
从边缘当作起点开始遍历搜索,然后标记能到达的点位true,分别标记出pacific和atlantic能到达的点,那么最终能返回的点就是二者均为true的点。 class Solution { public: vector> pacificAtlantic(vector>& matrix) { if (matrix.empty() || matrix[0].empty())原创 2017-10-15 21:30:39 · 202 阅读 · 0 评论 -
(M)DFS:117. Populating Next Right Pointers in Each Node II
这个题和之前的一样,要为二叉树每个节点填充next指针。但是这个题并不要求完全二叉树,而是随便一棵普通的二叉树。举个例子:[1,2,3,4,#,#,5],就不能用之前的做法。 这个题的思路是这样: 还是根据当前节点node,填充node->left和node->right的next指针,首先根据node->next->next->...(node这一层的所有节点)找到最先出现的node下面一层原创 2017-10-15 20:24:26 · 229 阅读 · 0 评论 -
(M)DFS:473. Matchsticks to Square
大神分析: 这道题让我们用数组中的数字来摆出一个正方形。跟之前有道题Partition Equal Subset Sum有点像,那道题问我们能不能将一个数组分成和相等的两个子数组,而这道题实际上是让我们将一个数组分成四个和相等的子数组。我一开始尝试着用那题的解法来做,首先来判断数组之和是否是4的倍数,然后还是找能否分成和相等的两个子数组,但是在遍历的时候加上判断如果数组中某一个数字大于一条边的长原创 2017-10-15 16:09:15 · 273 阅读 · 0 评论 -
(M)BFS:130. Surrounded Regions
这道题用的是DFS。 扫面矩阵的四条边,如果有O,则用DFS遍历,将所有连着的O都变成另一个字符#。这样剩下是O的就是被X包围着的O,都应该变成X。最后把#再变回O就可以了。 class Solution { public: void solve(vector>& board) { if(board.empty() || board[0].empty() || bo原创 2017-10-18 21:34:37 · 192 阅读 · 0 评论 -
DFS:690. Employee Importance
这道题是说,每一个员工有三个属性:id,重要性importance,直系下属id[]。题目给出每个员工的信息,并且给出一个id,求出这个员工的所有下属。 /* // Employee info class Employee { public: // It's the unique ID of each node. // unique id of this employee原创 2017-10-13 22:49:21 · 216 阅读 · 0 评论 -
DFS:695. Max Area of Island
这道题的意思是,给一个表格,由0或者1填充,求相连的1的最大面积。 这道题我开辟了一个和表格一样大的二维数组,用于记录这个点是否已经计算过了。dfs这个函数返回的是,当前点所在的一片1的面积。 class Solution { public: int maxAreaOfIsland(vector>& grid) { int m = grid.size();原创 2017-10-13 23:21:13 · 449 阅读 · 0 评论 -
DFS:101. Symmetric Tree
我另外写了一个参数是两个树结点的函数,判断左边的左子树和右边的右子树,还有左边的右子树和右边的左子树是不是相等的。 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode原创 2017-09-23 22:35:18 · 162 阅读 · 0 评论 -
DFS:112. Path Sum
这道题的一个测试例子是[]0->false。。。我觉得不太对啊,我总感觉这个应该输出true才对啊……不管了他说false就false吧,我的代码: /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right原创 2017-09-23 22:03:17 · 193 阅读 · 0 评论 -
DFS: 111. Minimum Depth of Binary Tree
这个题一开始我是按照求最大深度算的,只是把max改成min,发现大错特错。例如[1, 2]这个树就通不过。所以这次不能一次只看一个结点,一次需要看两层。如果左右子树都是NULL的才是叶子节点,左右子树有一个不是NULL他就不是叶子节点。我的代码: /** * Definition for a binary tree node. * struct TreeNode { * int v原创 2017-09-23 21:07:41 · 183 阅读 · 0 评论 -
DFS:104. Maximum Depth of Binary Tree
最大深度,典型的dfs。差点又想加一个if(root->left == NULL && root->right == NULL),没必要。代码很简单: /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *righ原创 2017-09-23 20:24:56 · 152 阅读 · 0 评论 -
DFS:108. Convert Sorted Array to Binary Search Tree
把一个排序的数组建成一个平衡的BST。既然是平衡的,就想到从中间位置开始建立根节点,然后左子树根节点又是左边一半的中间位置,右子树根节点又是右边一半的中间位置。很明显用递归可以解决。我的代码: /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left;原创 2017-09-23 19:53:21 · 129 阅读 · 0 评论 -
DFS:110. Balanced Binary Tree
判断是不是平衡树。首先写一个函数计算一棵树的高度,我用了递归。然后遍历这棵树,看每一个结点是不是都平衡。 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int原创 2017-09-23 18:03:56 · 214 阅读 · 0 评论 -
DFS:100. Same Tree
比较根节点,然后比较左子树,然后是右子树。 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(原创 2017-09-23 22:12:31 · 149 阅读 · 0 评论 -
DFS:257. Binary Tree Paths
第一个dfs题: /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }原创 2017-09-14 15:23:42 · 180 阅读 · 0 评论 -
(M)DFS:133. Clone Graph
每次搜索的时候看这个结点是不是已经被创建,是的话就返回其copy,否则就创建,然后再依次深度遍历其邻居结点并将其加入邻居集合中去 /** * Definition for undirected graph. * struct UndirectedGraphNode { * int label; * vector neighbors; * UndirectedGr原创 2017-10-17 14:05:15 · 190 阅读 · 0 评论