dfs
我要上岸!!!
这个作者很懒,什么都没留下…
展开
-
LeetCode 126 Word Search II
思路dfs+hashmap/trie。【hashmap版本】首先生成一个存前缀和单词的hashmap用来存一个前缀是否为一个单词,假设一个字符串已经是单词(true)了就不要更新成前缀(false)了。接下来在棋盘上4个方向dfs,由于一个单词中一个位置只能使用一次,于是需要使用一个visit来记录是否已经用过。如果当前字符串不在hashmap中就直接结束,否则如果当前字符串是一个单词,将其...原创 2019-10-26 14:56:50 · 181 阅读 · 0 评论 -
LeetCode 51 N-Queens
思路dfs搜索,其实是排列型搜索permutation。利用一个List来存每一列上存了什么数字,索引就是行数,可以保证每一行只有一个数字。搜索部分就是permutation模板实现,只是模板中的visit判断放入判断是否相互攻击的函数中了。判断是否不会相互攻击:(1)每行只有一个:通过list索引自动解决(2)每列只有一个:搜索所有已经存进list中的index是否与将加入的index重...原创 2019-10-08 14:00:09 · 126 阅读 · 0 评论 -
LintCode 10 String Permutation II
思路与Permutation的思路类似,使用与subsets II相同的去重思路。DFS搜索。时间复杂度O(n!)空间复杂度O(n)代码public class Solution { /** * @param str: A string * @return: all permutations */ public List<String&...原创 2019-10-08 10:53:29 · 206 阅读 · 0 评论 -
LintCode 136 / LeetCode 131 Palindrome Partitioning
思路dfs搜索。具体思路和组合型dfs模板几乎一致,然后每次搜索到一个新字符串时先判断是否为回文串;但是这里需要一些优化。优化1:可以对回文串检测预处理一下,现将所有可能的回文串结果保存到一个isPalindrome数组里,然后检测的时候就可以直接调用了,这里使用动态规划(区间型)的方式进行处理;优化2:在将合理的答案加入list时,不是直接截取子串然后放入list,而是先将子串结尾下标放入...原创 2019-09-16 13:31:29 · 185 阅读 · 0 评论 -
LintCode 680 Split String
思路dfs搜索问题,可以使用subset的模板,只是dfs中for循环条件有所改变,因为可以接受连续的最多2个字符作为子串。时间复杂度O(2^n)空间复杂度O(logn)代码public class Solution { /* * @param : a string to be split * @return: all possible split strin...原创 2019-09-16 08:07:51 · 306 阅读 · 0 评论 -
LintCode 90 K Sum II
思路dfs搜索,与Combination Sum的区别是多了一个限制:每个答案的长度为k。对于这种问题,只需要在dfs的传入参数列表中增加这个限制,并且相应修改递归出口。时间复杂度O(2^n)空间复杂度O(logn)代码public class Solution { /* * @param A: an integer array * @param k: a p...原创 2019-09-16 06:34:13 · 192 阅读 · 0 评论 -
LintCode 153 Combination Sum II
思路与combination sum思路基本一致,由于一个数字不能被重复使用,所以需要像Subsets II那题一样去重。时间复杂度O(2^n)空间复杂度O(logn)代码public class Solution { /** * @param num: Given the candidate numbers * @param target: Given th...原创 2019-09-16 00:44:22 · 116 阅读 · 0 评论 -
LintCode 135 Combination Sum
思路与subsets的思路几乎一致,只是在递归出口条件和dfs的输入参数有一点不同。本题需要额外对输入数组进行去重,思路参考LintCode 521的思路(双指针去重)。复杂度时间复杂度O(2^n)空间复杂度O(logn)代码public class Solution { /** * @param candidates: A list of integers ...原创 2019-09-15 14:41:41 · 163 阅读 · 0 评论 -
LintCode 18 Subsets II
思路跟Subsets的思路几乎一样,只是增加了一个去重。去重思路:排序之后的数组可以是[1,2,2],这样假设nums[i] == nums[i-1]并且i > startIndex(说明i和startIndex之间隔着至少一个数字),这样两个条件和到一起就说明是前面有个一样的数字没有被使用,于是需要跳过该情况。时间复杂度O(2^n)空间复杂度O(logn)代码public cla...原创 2019-09-15 13:04:23 · 101 阅读 · 0 评论 -
LintCode 17 Subsets
思路排列组合搜索,使用dfs解决。注意该题目与leetcode 78不同的一点是:每个结果中的数字必须是升序的,于是需要先对数组排序。复杂度时间复杂度O(nlogn)空间复杂度O(logn)代码public class Solution { /** * @param nums: A set of numbers * @return: A list of li...原创 2019-09-15 07:32:39 · 109 阅读 · 0 评论 -
LC 126 Word Ladder II
思路1:IDA*DFS的迭代加深搜索(IDA*)+剪枝。每次搜索都加深一层,直到搜索到符合的结果。首先需要构建一个Map来存储每个字典中的词对应的能变化成的单词,这里最好将start和end都加入到字典中,可以保证dfs的正常开始和退出;并且不会影响结果,因为如果提前搜到start则一定会绕路,如果提前搜到end那么也符合了题目要求无矛盾。具体解释见代码。剪枝:每一个单词都有一个变化次数下...原创 2019-05-28 14:45:32 · 129 阅读 · 0 评论 -
LintCode 634 Word Squares (LeetCode 425)
思路dfs+剪枝。这里是枚举型dfs:模拟多层嵌套的for循环。因为单词长度最多为5,所以最多5层循环,但是这里还是使用dfs来实现,目的一个是为了美观,另外也是为了如果遇到很多层循环要嵌套的作准备。dfs的过程就是在一个一个尝试所有的可能性,如果两个单词能依次放在一起,那么二者就有一条边相连。这里说一下剪枝的过程:(1)在放下一个单词的时候,直接从之前放过的单词里计算一个前缀prefix出来,...原创 2019-05-22 16:05:12 · 294 阅读 · 0 评论 -
LintCode 653 / LeetCode 282 Expression Add Operators
思路枚举型dfs。暴力枚举搜索,通过枚举所有的可能数字组合形式来看是否符合要求。每次枚举当前数字和其符号,对于+或-直接在结果val上进行加减操作即可,但是对于就需要使用一个lastFactor变量存储上一个连乘的结果,当前value=value-lastFactor+curlastFactor(原理是首先将上一个+/-的数也就是连乘的数lastFactor还原回去,然后再将其与cur相乘加到v...原创 2019-05-26 14:30:11 · 137 阅读 · 0 评论 -
LeetCode 538 (LintCode 661) Convert BST to Greater Tree
思路“反中根“遍历。从BST的最右节点开始遍历,然后记录当前的节点和,后面的每个节点只要加上这个和即可;在原树上修改。将中根遍历的left和right访问顺序反过来,使用一个全局变量sum记录当前的和。整体思路类似分治算法。代码/** * Definition of TreeNode: * public class TreeNode { * public int val; ...原创 2019-05-11 14:22:28 · 86 阅读 · 0 评论 -
LeetCode 366 (LintCode 650) Find Leaves of Binary Tree
思路类似与求树的高度(分治)。在每次求得当前节点的高度后,使用hashmap将结果保存下来(key=高度,value=一个list,存的是高度=key的所有节点的value)。由于使用分治法递归求树的高度的过程中,已经将每个节点的高度都求了一遍,所以在每次求得高度后将高度与节点值直接存到hashmap中,就不用对每一个节点进行一遍dfs了,保证时间复杂度为线性。代码/** * Defini...原创 2019-05-16 05:22:50 · 370 阅读 · 0 评论 -
LeetCode 254 Factor Combinations (LintCode 652 Factorization)
思路枚举类dfs+剪枝。dfs部分思路很简单,从小到大枚举即可保证题目中的非降序的要求。但是要注意每次dfs要对target进行重新计算,除以添加到path的数。剪枝:提前判断i和target/i的关系(即下一层dfs的后两个变量的大小关系),因为在进入for循环之后就可以立即计算出来这两个参数,在这里剪枝之后可以避免path的add和remove操作,还是有一定作用的。但是这样会误伤dfs(...原创 2019-05-24 14:05:45 · 628 阅读 · 0 评论 -
LeetCode 156 / LintCode 649 Binary Tree Upside Down
思路根据题目中给出的树的要求:右节点要么为空,要么与左节点同时存在并且此时的右节点为叶子节点。因此,本题要做的就是修改每个左节点的指向(除了原来的root)。由于本题中的树存在上面的性质,所以只需要修改左节点即可。递归搜索后修改指向即可。【需要注意的是:为了保证原来的root与left和right之间在修改之后不会形成环,要加上root.left=null, root.right=null;...原创 2019-05-15 15:32:44 · 249 阅读 · 0 评论 -
LeetCode 140 (LintCode 582) Word Break II
思路记忆化dfs使用一个memo来记录各个子问题的解,可以避免相同子问题的重复计算。复杂度时间复杂度O(2^n)空间复杂度O(2^n)代码class Solution { public List<String> wordBreak(String s, List<String> wordDict) { Map<String, Lis...原创 2019-03-17 16:05:15 · 194 阅读 · 0 评论