Leetcode
我要上岸!!!
这个作者很懒,什么都没留下…
展开
-
LeetCode 126 Word Search II
思路dfs+hashmap/trie。【hashmap版本】首先生成一个存前缀和单词的hashmap用来存一个前缀是否为一个单词,假设一个字符串已经是单词(true)了就不要更新成前缀(false)了。接下来在棋盘上4个方向dfs,由于一个单词中一个位置只能使用一次,于是需要使用一个visit来记录是否已经用过。如果当前字符串不在hashmap中就直接结束,否则如果当前字符串是一个单词,将其...原创 2019-10-26 14:56:50 · 163 阅读 · 0 评论 -
LeetCode 38 Count and Say
思路字符串处理。遇到连续相同的数字就接着寻找下去(i+1 < len && s[i] == s[i+1]), 否则就将出现次数和字符加到结果字符串里面并且count复原为1,这样count的初始值应该为1,因为无论是否满足上面的条件,都要算一个字符。每一轮都会更新所要搜索的字符串。时间复杂度O(n^2)【最坏情况】空间复杂度O(1)代码class Solution ...原创 2019-10-16 10:16:17 · 155 阅读 · 0 评论 -
LeetCode 299 Bulls and Cows
思路使用2个hash table,分别存储secret和guess中每个数字出现的次数。同时遍历两个数组,如果secret和guess对应的数字相同,那么A++;否则就将二者记录到对应的hash table中。最后同时遍历两个hash table,分别取每一个位置的secret和guess中的最小值作为匹配值,加到B上。时间复杂度O(len)空间复杂度O(len)代码class Solu...原创 2019-10-14 06:51:44 · 116 阅读 · 0 评论 -
LeetCode 686 Repeated String Match
思路假设重复A字符串k次,使得A.length >= B.length,只需比较此时B是否为A的子串和k+1时B是否为A的子串即可,因为再多了就是重复查找了。利用String/StringBuilder的indexOf来得到是否为子串。时间复杂度O(n^2)空间复杂度O(1)代码class Solution { public int repeatedStringMatch(...原创 2019-10-13 15:12:45 · 86 阅读 · 0 评论 -
LeetCode 847 Shortest Path Visiting All Nodes
思路由于是求简单图最小路径问题,所以可以用BFS来解决(最短路模版,每次遍历一层节点)。可以发现,一条路径的最终的长度只与最后一个经过的点有关系,跟访问前面节点的顺序没有关系。所以我们可以用一个二维visit数组记录每种路线终点所对应的路线,避免重复搜索;BFS的队列中存储一维数组node,node[0]:最后一个节点,node[1]:路线对应的整数【在这里将路线压缩成一个整数,原理是使用二进制...原创 2019-10-13 06:55:57 · 373 阅读 · 0 评论 -
LeetCode 409 Longest Palindrome
思路统计字符出现次数,偶数的话直接加到sum里面,如果奇数的话减一后加到sum里面并且flag=1(标记)。最后sum要加上奇数标记flag(最后再加上1,因为所有的奇数频率中可以有一个放在正中间:aabbbcc,因此可以有一个奇数频率的字母不用-1, 但是flag是有用的,因为如果所有的字母出现次数都是偶数,那么就不需要-1了)。技巧:字符哈希,int[128] charmap映射ASCI...原创 2019-06-23 16:02:31 · 74 阅读 · 0 评论 -
LeetCode 102 Binary Tree Level Order Traversal
思路BFS,但是需要每次将下一层所有节点都放入queue中复杂度时间复杂度O(n)空间复杂度O(n)代码/** * Definition of TreeNode: * public class TreeNode { * public int val; * public TreeNode left, right; * public TreeNode(in...原创 2019-06-24 10:32:44 · 54 阅读 · 0 评论 -
LeetCode 133 Clone Graph
思路【BFS遍历有向图(树)不需要visit,无向图上需要visit】思路1:bfs遍历整张图,注意需要加上visit来判断节点是否被访问过。在放入queue的时候就标记visit。如果visit过,那么就在neighbor列表上加上它;否则就需要建立新node+建立映射+加入neighbor列表。时间复杂度O(n+m)空间复杂度O(n)思路2:同样是bfs遍历整张图,不同的是:首先把所...原创 2019-07-08 15:53:01 · 72 阅读 · 0 评论 -
LeetCode 297 Serialize and Deserialize Binary Tree
思路Serialize:用arraylist代替queue进行bfs,使用index来完成,把所有节点加入一个arraylist,然后再统一转成字符串(StringBuilder)。注意需要在把所有节点加入arraylist后,进行从后往前的删除null值。Deserialize: 同样使用一个arraylist,使用一个index来标记当前根节点,同时使用isLeftChild标记当前应该生...原创 2019-07-07 02:24:16 · 116 阅读 · 0 评论 -
LeetCode 127 Word Ladder
思路隐式图BFS,每一个状态看作图中的每个节点。从起点开始BFS的同时记录level层数,方便返回结果。复杂度时间复杂度为O(n∗26l)O(n*26^l)O(n∗26l)空间复杂度为O(n)O(n)O(n)其中,n为字典大小,l为每个单词的长度代码public class Solution { /* * @param start: a string * ...原创 2019-07-19 15:21:42 · 189 阅读 · 0 评论 -
LintCode 1380 Log Sorting (LeetCode 937 Reorder Log Files)
思路重写比较器对日志内容为字母的日志进行排序:其中可以调用String的compareTo方法,因为其返回值符合比较器的compare函数的返回值规则。具体实现:首先利用String的indexOf找到第一个空格的位置,然后就可以把原日志分成id与内容两个字符串。然后就可以按照规则进行比较了。主函数的实现:用一个list存字母型日志,方便后面直接调用sort方法排序。倒着遍历所有日志,遇到数...原创 2019-05-19 13:43:13 · 433 阅读 · 0 评论 -
LintCode 433 Number of Islands
思路BFS, 从全图中所有为1的地方开始BFS,向4个方向进行搜索,在将起点加入queue的同时将其标记为0或者开一个visit数组标记已访问。复杂度时间复杂度O(n*m)空间复杂度O(n*m)代码class Coordinate { int x, y; public Coordinate(int x, int y) { this.x = x; ...原创 2019-07-28 11:39:41 · 160 阅读 · 0 评论 -
LeetCode 125 Valid Palindrome
思路两个相向的指针left和right,遇到非字母和数字就直接跳过,比较left和right是否相同。注意:(1)left和right有范围限制;(2)如果遇到”…” 类型的字符串,可以在比较left是否到达字符串末端来判断。复杂度时间复杂度O(n)空间复杂度O(1)代码class Solution { public boolean isPalindrome(String...原创 2019-06-23 15:42:22 · 68 阅读 · 0 评论 -
LeetCode 28 Implement strStr()
思路在source里逐个字符作为起始点检查是否包含子字符串。注意特殊情况处理:见代码复杂度时间复杂度O(n^2)空间复杂度O(1)代码class Solution { public int strStr(String haystack, String needle) { int srcLen = haystack.length(); int t...原创 2019-06-23 14:40:03 · 80 阅读 · 0 评论 -
LC 126 Word Ladder II
思路1:IDA*DFS的迭代加深搜索(IDA*)+剪枝。每次搜索都加深一层,直到搜索到符合的结果。首先需要构建一个Map来存储每个字典中的词对应的能变化成的单词,这里最好将start和end都加入到字典中,可以保证dfs的正常开始和退出;并且不会影响结果,因为如果提前搜到start则一定会绕路,如果提前搜到end那么也符合了题目要求无矛盾。具体解释见代码。剪枝:每一个单词都有一个变化次数下...原创 2019-05-28 14:45:32 · 117 阅读 · 0 评论 -
LintCode 634 Word Squares (LeetCode 425)
思路dfs+剪枝。这里是枚举型dfs:模拟多层嵌套的for循环。因为单词长度最多为5,所以最多5层循环,但是这里还是使用dfs来实现,目的一个是为了美观,另外也是为了如果遇到很多层循环要嵌套的作准备。dfs的过程就是在一个一个尝试所有的可能性,如果两个单词能依次放在一起,那么二者就有一条边相连。这里说一下剪枝的过程:(1)在放下一个单词的时候,直接从之前放过的单词里计算一个前缀prefix出来,...原创 2019-05-22 16:05:12 · 281 阅读 · 0 评论 -
LeetCode 285 / LintCode 448 Inorder Successor in BST
思路思路1: 直接递归寻找后继,不考虑BST的性质,当作一般的二叉树来考虑。用递归很容易实现。时间复杂度O(n),空间复杂度O(log n)(递归栈)思路2:考虑BST的性质,类似二分的思想(为了O(h)的复杂度)。每次将p与root的值进行对比:(1)p>=root, 则搜索右子树;(2)p<root, 则搜索左子树,后继存在两种可能性:root或者左子树中的某个节点。如果...原创 2019-05-13 13:25:49 · 212 阅读 · 0 评论 -
LintCode 653 / LeetCode 282 Expression Add Operators
思路枚举型dfs。暴力枚举搜索,通过枚举所有的可能数字组合形式来看是否符合要求。每次枚举当前数字和其符号,对于+或-直接在结果val上进行加减操作即可,但是对于就需要使用一个lastFactor变量存储上一个连乘的结果,当前value=value-lastFactor+curlastFactor(原理是首先将上一个+/-的数也就是连乘的数lastFactor还原回去,然后再将其与cur相乘加到v...原创 2019-05-26 14:30:11 · 123 阅读 · 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 · 76 阅读 · 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 · 366 阅读 · 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 · 608 阅读 · 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 · 237 阅读 · 0 评论 -
LeetCode 50 Pow(x, n)
思路快速幂。一个数的幂次可以转成二进制,从最右侧开始,遇到1就乘到结果里。基数x一直在做平方的运算。原理就是任何一个数都可以拆成1,2,4,8,…的和的形式。需要注意边界:当n小于0的时候,先把n转成-(n+1)【防止MIN_INT直接取相反数导致溢出】,然后在result开始的时候多乘一个x即可。有递归和非递归两种实现方式,代码在下面都贴出来了复杂度时间复杂度O(logn)空间复杂度O...原创 2019-08-19 11:27:02 · 72 阅读 · 0 评论 -
LeetCode 269 / LintCode 892 Alien Dictionary
思路【lintcode 892有一个条件不一样:遇到有多个顺序的时候,输出最小的那个】思路:拓扑排序。每个字母都是图中的一个节点,然后通过比较相邻的两个字符串得到具体两个字母的顺序【由于传递性,所以只需要比较相邻两个字符串】。可以使用优先队列来做拓扑排序,这样可以保证取到的顺序一直是最小的。时间复杂度O(naL+2mlogm), n-字符串个数,aL-单词平均长度,m-总字母个数。因为在to...原创 2019-08-10 18:21:21 · 478 阅读 · 0 评论 -
LeetCode 658 Find K Closest Elements
思路二分查找。首先二分查找到最后一个<=target的位置,并将left设置为该位置,right为该位置+1,然后根据left和right与target的差值得到left和right指针移动的条件(left和right指针都指向下一个位置,可以从k的初始化看出来)。最后将[left+1, right-1]内的元素依次存入arraylist即可。时间复杂度O(logn+k)空间复杂度O(...原创 2019-08-15 16:33:44 · 181 阅读 · 0 评论 -
LeetCode 1057 Campus Bikes
思路、思路:使用priority queue并且重写比较器,(o1,o2):当需要递增/最小堆时,o1<o2:-1;递减/最大堆时,o1-o2:1. 然后根据给出的条件构造每一个Triple然后将其放入pq中。然后在填写result数组时,要先判断poll出来的worker和bike有没有被用过,用过就直接continue,可以使用2个boolean数组来进行判断。时间复杂度O(NM l...原创 2019-10-11 12:31:12 · 975 阅读 · 0 评论 -
LeetCode 51 N-Queens
思路dfs搜索,其实是排列型搜索permutation。利用一个List来存每一列上存了什么数字,索引就是行数,可以保证每一行只有一个数字。搜索部分就是permutation模板实现,只是模板中的visit判断放入判断是否相互攻击的函数中了。判断是否不会相互攻击:(1)每行只有一个:通过list索引自动解决(2)每列只有一个:搜索所有已经存进list中的index是否与将加入的index重...原创 2019-10-08 14:00:09 · 122 阅读 · 0 评论 -
LeetCode 10 Regular Expression Matching
思路记忆化搜索。与LC 44 的解法几乎一致,有几个细节需要修改。(1)当s到达末尾时,需要p的内容为aa的模式而不是全部的*(2)需要判断pIndex+1位置是否为*,而不是pIndex处,因为* 是来匹配前一个字符的;并且此处的行为:(sIndex, pIndex + 2)对应*匹配sIndex 0次,charMatch(sc, pc) && (sIndex + 1,...原创 2019-10-06 14:15:04 · 98 阅读 · 0 评论 -
LeetCode 44 Wildcard Matching
思路思路:记忆化搜索/dp,使用一个visited数组记录memo中某一个元素是否被访问过即是否被加入memo。由于可以匹配任意数量的字符(包括0个),所以(1)当pattern中当前位置pIndex处为时,有2种情况:source中匹配0个或者>=1个,对应下一个搜索状态就是(sIndex, pIndex + 1)和(sIndex + 1, pIndex),二者满足一个即可; (2)当...原创 2019-10-02 12:37:22 · 99 阅读 · 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 · 109 阅读 · 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 · 156 阅读 · 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 · 96 阅读 · 0 评论 -
LeetCode 1007 Minimum Domino Rotations For Equal Row
思路只存在三种情况:相同的数是A[0]/B[0]/null。然后分别将A[0],B[0]作为target,同时遍历A和B数组。如果位置i的A和B的值与A[0],B[0]都不等,那么说明不可能完成该任务;否则相应的rotationA++或者rotationB++。最后取一个最小值(贪心)返回即可。复杂度时间复杂度O(n)空间复杂度O(1)代码class Solution { pu...原创 2019-09-13 13:49:07 · 181 阅读 · 0 评论 -
LintCode 5 / LeetCode 215 Kth Largest Element
思路quick select / partition(二者是一个东西)复杂度时间复杂度O(n)空间复杂度O(n)代码public class Solution { /** * @param n: An integer * @param nums: An array * @return: the Kth largest element */...原创 2019-09-10 12:47:06 · 144 阅读 · 0 评论 -
LeetCode 170 Two Sum III - Data structure design
思路 + 复杂度用一个hashmap存数字及其出现的次数,用一个list存出现的数字(不重复的)。add:将元素存入hashmap和list。时间复杂度O(1),空间复杂度O(1)find:遍历list,依次在map中寻找list中的每个数字能否组成一个要求的和。假设找到的num1和num2相等,还需要判断它是否出现了>=2次。时间复杂度O(n),空间复杂度(1)代码class Tw...原创 2019-09-09 05:05:23 · 138 阅读 · 0 评论 -
LeetCode 881 Boats to Save People
思路贪心+双指针。将数组排序后,两个指针分别指向最轻的和最重的两个人。如果二者之和超过limit,那么只能让最重的人上船;否则二人可上一艘船。复杂度时间复杂度O(n)空间复杂度O(1)代码class Solution { public int numRescueBoats(int[] people, int limit) { Arrays.sort(people...原创 2019-09-05 15:04:22 · 116 阅读 · 0 评论 -
LeetCode 221 Maximal Square
思路dp解法。dp[i][j]表示以(i, j)为右下角的正方形的最大边长;状态转移方程:dp[i][j] = min(dp[i-1][j-1], dp[i][j-1], dp[i-1][j]) + 1;初始状态:i == 0 || j == 0, dp[i][j] = matrix[i][j].复杂度时间复杂度O(n*m) = O(n^2)空间复杂度O(n*m) = O(n^2)代...原创 2019-09-03 13:59:45 · 99 阅读 · 0 评论 -
LeetCode173 / LintCode 86 Binary Search Tree Iterator
思路next使用bst的迭代版中序遍历初始化和next基本组成了bst迭代版的中序遍历复杂度hasNext, next时间复杂度O(1)空间复杂度O(1)代码/** * Definition of TreeNode: * public class TreeNode { * public int val; * public TreeNode left, righ...原创 2019-08-29 23:09:36 · 120 阅读 · 0 评论 -
LeetCode 230 / LintCode 902 Kth Smallest Element in a BST
思路利用BST的性质,进行中序遍历可以得到一个非递减的序列。本题主要考察BST遍历的迭代写法。复杂度时间复杂度O(n)空间复杂度O(n)代码/** * Definition of TreeNode: * public class TreeNode { * public int val; * public TreeNode left, right; * ...原创 2019-08-29 13:45:50 · 119 阅读 · 0 评论 -
LC 162 Find Peak Element (LintCode 75 条件稍有不同)
思路主要讨论上坡、下坡和波峰。上坡:与后一个元素比较;下坡:与前一个元素比较;波峰:与左右都比较,可以直接作为最后一个情况,放到else里处理。注意前后比较的时候越界问题LintCode75 与这题几乎一样,只是条件有很小的差别。由于条件规定了前两个元素和后两个元素的大小关系,所以peak一定是在1~length-1之间的,于是就可以省去了index的合法性检查。时间复杂度和空间复杂度不变...原创 2019-08-18 15:36:04 · 118 阅读 · 0 评论