DFS
文章平均质量分 76
bsbcarter
这个作者很懒,什么都没留下…
展开
-
LeetCode-Word Search
DFS 想清楚停止条件 在本层判断所在的位置是否符合要匹配的字母,假如符合再递归进入四个方向。 注意假如没找到 清空用来标记是否走过的那个矩阵。原创 2015-02-11 07:35:18 · 339 阅读 · 0 评论 -
*LeetCode-Balanced Binary Tree
感觉一写递归就全是错。 首先练熟递归,然后搞清楚dfs bfs与各种traversal关系,再写树 这个题首先一开始递归写的有问题,既然每次已进入helper函数,首先判断了node是否为空,就不要再继续先判断是否有左右子再递归了,直接递归就行。正确的: public int countD ( TreeNode node){ if ( node == null)原创 2015-03-04 01:24:40 · 310 阅读 · 0 评论 -
*LeetCode-Kth Smallest Element in a BST
一个函数来数这个root下一共多少node 非常简单 recursive 然后就是主函数中判断left有多少node的时候需要数右边 想清楚 +1 -1的事情 因为要算上root本身 public class Solution { public int kthSmallest(TreeNode root, int k) { if ( countNode ( root.l原创 2015-09-27 07:53:41 · 234 阅读 · 0 评论 -
*LeetCode-Binary Tree Right Side View
应该看出来和level order traversal 一样 第一种方法就是基于这个的 每次展开一层 从最右边开始展开 然后将这一层的第一个放入 即最右边一个 用一个queue维护 public class Solution { public List rightSideView(TreeNode root) { Queue que = new LinkedList原创 2015-09-27 10:10:44 · 239 阅读 · 0 评论 -
*LeetCode-Number of Islands
扫一遍就可以了 只要这个点是1 就开始explore它的neighbors 然后知道没有了 就返回 这时候主程序 count++ 记得要把explore过的点mark为0 public class Solution { public int numIslands(char[][] grid) { int count = 0; for ( int i = 0原创 2015-09-29 05:33:57 · 222 阅读 · 0 评论 -
*LeetCode-Path Sum II
和以前做的backtracking很像 但是注意要删除这次add的node!!否则左边recurse加上了left 到了右边却没有remove left就继续了 public class Solution { public List> pathSum(TreeNode root, int sum) { List> res = new ArrayList> ();原创 2015-10-06 03:21:41 · 242 阅读 · 0 评论 -
*LeetCode-Count Univalue Subtrees
想到了用递归判断子树中的count 并且记录目前位置所有数字是否unify 但是没有想好怎么存这些信息 怎么返回,count 可以作为static var 然后helper就返回boolean 注意count更新的条件 返回true false的条件很难归置好 注意判断left right 是否为null 返回false的条件就是首先 left right递归后都要是ture 同时left不是原创 2015-10-22 03:55:18 · 619 阅读 · 0 评论 -
*LeetCode-Binary Tree Maximum Path Sum
写一个helper计算从这个点向下能到达的最大sum 然后每次更新全局最大sum 记得每次left 和 right 是要和0比较 因为可以不向下走 最下也是0 public class Solution { int max = Integer.MIN_VALUE; public int maxPathSum(TreeNode root) { maxDown ( r原创 2015-10-09 23:49:38 · 229 阅读 · 0 评论 -
LeetCode-Invert Binary Tree
tree一般就用recursion 还需要继续练习 需要注意的是recursion总是和循环写混乱,并不需要loop了 最开始我把if写成了while public class Solution { public TreeNode invertTree(TreeNode root) { if ( root == null ) return nu原创 2015-09-14 23:18:36 · 370 阅读 · 0 评论 -
*LeetCode-Walls and Gates
看到这个题好想哭啊 fb面的这个 我是想到了count island那个题 用了dfs 一开始应该是死循环了? 溢出 然后看答案是假如这个点没有更新 那从它开始的四周也就没必要再更新了 没想清楚 这样的话感觉是mn的时间复杂度 public class Solution { public void wallsAndGates(int[][] rooms) { if (原创 2015-10-28 12:00:44 · 355 阅读 · 0 评论 -
*LeetCode-Valid BST
错误解法:以为遍历的时候每次查看是否left 递归解法就需要每次传入两个界,min max,是根据当前的parent已经parent的情况确定的。要注意test case就是MAX_VALUE MIN_VALUE, 因为定义中是严格大于小于 所以在判断非法树的时候 写的是root.val >= max || root.val 所以要用root.val > max || root.val原创 2015-03-08 03:11:45 · 347 阅读 · 0 评论 -
*LeetCode-Binary Search Tree Iterator
设计数据结构,用一个内部的stack存所有小于root的节点,即push的顺序是从大到小的,实现一个pushall函数 就是push这个node一直往左走路径上的所有节点。 public class BSTIterator { private Stack stack = new Stack(); public BSTIterator(TreeNode root) {原创 2015-03-08 08:01:46 · 335 阅读 · 0 评论 -
LeetCode-Path Sum
典型dfs,但是dfs写的太少了== base case想了很久,main函数里面怎么处理第一次调用也想了很久。把判断条件搞错了好几次。应该在每次走到这个节点时就判断左右子是否为空。 /** * Definition for binary tree * public class TreeNode { * int val; * TreeNode left; *原创 2015-02-26 01:22:04 · 309 阅读 · 0 评论 -
LeetCode-Same Tree
和上一题几乎一模一样,只是不用左右交替了,更简单,把上个symmetric的helper function稍微改一下就是这个题了 public class Solution { public boolean isSameTree(TreeNode p, TreeNode q) { if ( p == null || q == null ){ ret原创 2015-03-04 07:48:18 · 234 阅读 · 0 评论 -
*LeetCode-Symmetric Tree
今天怎么状态这么不好,感觉这个题不简单啊,居然是easy。 看了答案才写出来。两种,recursive代码很简单,只是想清楚不容易,感觉怎么写helper要想明白。 iterative 写了好久,总是出错,用stack实现,每次push一对对应位置上的node,即应该相等的node。push进去之前就判断这对的值是否相等,pop出来之后,对于这一对,要检查一下前提条件(是否都具有左右子,对应原创 2015-03-04 07:33:28 · 344 阅读 · 0 评论 -
*LeetCode-Binary Tree Postorder Traversal
code ganker说这个的非递归很难,看了半天觉得好麻烦,看到discussion里面有个特别天才的解法!! preorder 是root-left-right, postorder是 left-right-root。那么稍微改一下preorder 变成 root-right-left 那个么就和postorder顺序完全相反了!!只要Collections.reverse就行!! 代码:原创 2015-03-08 00:47:52 · 286 阅读 · 0 评论 -
*LeetCode- Sum Root to Leaf Numbers
这个题一开始一直想从叶子开始加,后来发现从root向下走比较方便。递归函数传一个记录到达当前节点的和。 recursive: public class Solution { public int sumNumbers(TreeNode root) { return sum(root,0); } public int sum (TreeNode root,原创 2015-03-08 08:32:42 · 303 阅读 · 0 评论 -
*LeetCode-Binary Tree Preorder Traversal
preorder,inorder, postorder都属于dfs “第一种是以图的深度优先搜索为原型的遍历, 可以是中序, 先序和后序三种方式, 不过结点遍历的方式是相同的, 只是访问的时间点不同而已, 对应于Binary Tree Inorder Traversal, Binary Tree Preorder Traversal和Binary Tree Postorder Tra原创 2015-03-08 00:11:34 · 376 阅读 · 0 评论 -
LeetCode-Binary Tree Inorder Traversal
和前序几乎一模一样,递归里面就是add的时间在进入左右子之间 非递归的就是把add那句话放进了else中,即当前node为null,pop stack返回上一层时加入这个node 递归: public class Solution { public List inorderTraversal(TreeNode root) { List list = new Array原创 2015-03-08 00:24:35 · 250 阅读 · 0 评论 -
*LeetCode-Flatten Binary Tree to Linked List
感觉这个题像前序遍历,但是其实完全按preorder的话 我只能想到用两个stack 太不好了 看到用stack的iterative 发现入stack顺序和preorder不一样,才能保证出来的时候是这个顺序 即先push right 再push left,pop之后的右子设置为当前stack top 这个里面强调不要忘记将左子设置为null; public void flatten原创 2015-03-08 01:59:11 · 365 阅读 · 0 评论 -
LeetCode-Minimum Depth of Binary Tree
DFS 里面的if else写错了 第一段是正确代码,第二段是错误的。错误的写法就是因为多写了一个else,就不会再进right那边了。 public class Solution { public int minDepth(TreeNode root) { if ( root == null ) return 0; int min原创 2015-02-26 03:10:22 · 294 阅读 · 0 评论 -
LeetCode-Maximum Depth of Binary Tree
递归方法非常简单 只要判断左右depth 取max+1就行 public class Solution { public int maxDepth(TreeNode root) { if ( root == null ) return 0; int left = maxDepth(root.left); int ri原创 2015-03-08 07:23:57 · 346 阅读 · 0 评论 -
*LeetCode-Smallest Rectangle Enclosing Black Pixels
常规做法dfs bfs O(mn) bfs需要新建一个class存坐标 dfs不用存 更简便一点 记得每次访问过1后要给他设置成0 public class Solution { int minX = Integer.MAX_VALUE, maxX = 0, minY = Integer.MAX_VALUE, maxY = 0; public int minArea(char[原创 2015-11-25 01:58:36 · 515 阅读 · 0 评论