LintCode
我要上岸!!!
这个作者很懒,什么都没留下…
展开
-
LintCode 685 First Unique Number in Data Stream
思路如果没限制遍历次数的话,可以第一遍遍历简单的先用hashmap记录次数,第二次遍历nums数组来寻找第一个unique的数字。如果只能遍历一遍的话就是用linkedlist+hashmap的做法。时间复杂度O(n)空间复杂度O(n)代码public class Solution { /** * @param nums: a continuous stream of ...原创 2019-11-10 14:49:41 · 456 阅读 · 0 评论 -
LintCode 31 Partition Array
思路双指针。左右两个指针,首先分别从左边寻找大于k的第一个数,从右边寻找小于k的第一个数,然后交换。重复此过程,直到left>right。注意,在这里的循环条件是left<=right,目的是让循环结束后数组的划分更加清晰,可以直接返回left,而不需要在循环外面再写另外的判断条件。复杂度时间复杂度O(n)空间复杂度O(1)代码public class Solution {...原创 2019-09-09 14:03:07 · 141 阅读 · 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 · 128 阅读 · 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 · 124 阅读 · 0 评论 -
LC 162 Find Peak Element (LintCode 75 条件稍有不同)
思路主要讨论上坡、下坡和波峰。上坡:与后一个元素比较;下坡:与前一个元素比较;波峰:与左右都比较,可以直接作为最后一个情况,放到else里处理。注意前后比较的时候越界问题LintCode75 与这题几乎一样,只是条件有很小的差别。由于条件规定了前两个元素和后两个元素的大小关系,所以peak一定是在1~length-1之间的,于是就可以省去了index的合法性检查。时间复杂度和空间复杂度不变...原创 2019-08-18 15:36:04 · 128 阅读 · 0 评论 -
LintCode 585 Maximum Number in Mountain Sequence
思路二分法。同样是先建立ooxx的模型并且画一个图,用具体的例子进行尝试从而得到二分的条件。这里是判断mid和mid+1的大小关系来判断在那一段数据上(上升段/下降段)。复杂度时间复杂度O(logn)空间复杂度O(1)代码public class Solution { /** * @param nums: a mountain sequence which incre...原创 2019-08-18 08:52:15 · 158 阅读 · 0 评论 -
LeetCode 153 Find Minimum in Rotated Sorted Array
思路二分法。寻找第一个<=last number的点(不能找第一个</<=first number,可以举例子得到,<: 12345 = o x x x x;<=:45123 = x o x x x)。比如:4 5 1 2 3 || 1 2 3 4 5o o x x x || x x x x x复杂度时间复杂度O(logn)空间复杂度O(logn)代码...原创 2019-08-17 18:30:12 · 109 阅读 · 0 评论 -
LintCode 596 Minimum Subtree
思路裸分治法。使用ResultType作为返回类型可以避免使用全局变量。复杂度时间复杂度O(n)空间复杂度O(logn)代码/** * Definition of TreeNode: * public class TreeNode { * public int val; * public TreeNode left, right; * public T...原创 2019-08-21 14:53:30 · 217 阅读 · 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 · 192 阅读 · 0 评论 -
LeetCode 269 / LintCode 892 Alien Dictionary
思路【lintcode 892有一个条件不一样:遇到有多个顺序的时候,输出最小的那个】思路:拓扑排序。每个字母都是图中的一个节点,然后通过比较相邻的两个字符串得到具体两个字母的顺序【由于传递性,所以只需要比较相邻两个字符串】。可以使用优先队列来做拓扑排序,这样可以保证取到的顺序一直是最小的。时间复杂度O(naL+2mlogm), n-字符串个数,aL-单词平均长度,m-总字母个数。因为在to...原创 2019-08-10 18:21:21 · 488 阅读 · 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 · 82 阅读 · 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 · 170 阅读 · 0 评论 -
LintCode 611 Knight Shortest Path
思路BFS,带level信息的坐标型。每次将一层元素都取出来,然后加入队列的时候将其标记为1(障碍)。复杂度时间复杂度O(nm)空间复杂度O(nm)代码/** * Definition for a point. * class Point { * int x; * int y; * Point() { x = 0; y = 0; } * Po...原创 2019-07-29 15:22:47 · 222 阅读 · 0 评论 -
LintCode 578 Lowest Common Ancestor III
思路基本与LCA那题类似,判断树根和子树,只是需要额外保存A,B节点是否在node的子树中存在的信息。使用ResultType来保存该信息。复杂度时间复杂度O(n)空间复杂度O(n)代码/** * Definition of TreeNode: * public class TreeNode { * public int val; * public TreeNo...原创 2019-09-02 00:24:32 · 113 阅读 · 0 评论 -
LintCode 587 Two Sum - Unique pairs
思路1排序+双指针。指针移动的过程中,遇到了相同的元素就直接跳过。时间复杂度O(nlogn)空间复杂度O(1)代码1public class Solution { /** * @param nums: an array of integer * @param target: An integer * @return: An integer ...原创 2019-09-09 10:03:22 · 315 阅读 · 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 评论 -
LintCode 521 Remove Duplicate Numbers in Array
思路1HashSet记录不重复数字,然后从数组开头开始替换成hashset中的元素。时间复杂度O(n)空间复杂度O(n)代码1public class Solution { /** * @param nums an array of integers * @return the number of unique integers */ pub...原创 2019-09-12 10:26:16 · 235 阅读 · 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 · 151 阅读 · 0 评论 -
LintCode 464 Sort Integers II
思路快排练习,不多说复杂度时间复杂度:平均O(nlogn),最坏O(n^2)空间复杂度:平均O(logn),最坏O(n)代码public class Solution { /** * @param A: an integer array * @return: nothing */ public void sortIntegers2(int[...原创 2019-09-10 11:35:24 · 157 阅读 · 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 · 205 阅读 · 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 · 124 阅读 · 0 评论 -
LeetCode 752 Open the Lock (LintCode 796)
思路隐式图bfs,level-order bfs。定义每一个状态为图中的一个节点,例如“0000”。然后每一个节点与其能通过+1/-1转动某一位得到的状态节点之间有一条无向边。然后进行层序bfs遍历,搜索target,并记录层数dist。在实现的时候,可以定义每一层节点都加入过队列之后(筛选过),dist++;定义先尝试计算next,再决定是否将next加入队列(是否为死锁),一旦决定next...原创 2019-04-21 04:54:09 · 176 阅读 · 0 评论 -
LintCode 598 Zombie in Matrix
思路棋盘图bfs。用bfs从zombie开始向人类进行感染(搜索),这里需要一层一层地搜索:bfs中每次将下一层的所有元素都放到队列里(类似二叉树zigzag层序遍历那题),同时将下一层元素从0标记为1,记录层数depth。开始的时候需要记录下人类数量,最后检查人类的数量是否为0,如果不为0说明有的人类无法被感染,返回-1;否则,需要返回depth-1,因为最后无法继续向四周扩展的时候,循环外...原创 2019-04-08 05:23:42 · 409 阅读 · 0 评论 -
LeetCode 286 Walls and Gates
思路思路1:暴力搜索,对每个空房间(INF)进行bfs,不过此时的bfs应该是每次向队列中加下一层的元素而不是单个元素,否则深度会算错。时间复杂度O(n2∗m2n^2 * m^2n2∗m2), 空间复杂度O(n∗mn*mn∗m)思路2:思路1为多源多终点,可以转化为单源多终点(增加一个超级源,最短路常用套路):从所有的门开始搜索,这样可以避免思路1中重复经过某些空房间。在实现的时候忽略了...原创 2019-04-07 16:42:42 · 269 阅读 · 0 评论 -
LeetCode 130 Surrounded Regions
思路bfs搜索,从四周开始灌水,寻找不被x包围的区域,先替换成W。最后再将O换成X, W换成O即可。该题主要是看代码的实现过程和bfs灌水的思想。代码public class Solution { /* * @param board: board a 2D board containing 'X' and 'O' * @return: nothing *...原创 2019-04-07 09:58:10 · 147 阅读 · 0 评论 -
LeetCode 65 Valid Number
思路需要考虑一些cases,以下例来编写该题的算法:+2.5e+5。首先用trim将两端的空格去掉,遇到+/-时单独判断;在判断2.5这种浮点数的时候,只需要统计是.和数字的部分,即sc[1]~sc[3],统计.和数字的个数,小数点只能有一个,数字个数需要大于0,不符合条件的可以直接返回false。然后判断e,后面需要接内容,不能以e结束,所以在这里判断一次:i == len。在最后只需要判断i...原创 2019-04-01 13:53:18 · 90 阅读 · 0 评论 -
LeetCode 527 / LintCode 639 Word Abbreviation
思路根据给定的规则,定义:(1)阶段数组prefix,存放当前字符串的位于的阶段;(2)定义一个保存结果的数组ans,存放当前阶段的缩写;(3)一个hashmap:count,用来记录当前结果ans在整个ans中的出现次数。首先从头遍历一遍整个dict,记录好ans,prefix和hashmap然后定义一个while(true)循环,里面一直更改重复的ans,直到所有的ans都唯一。...原创 2019-04-06 13:36:04 · 377 阅读 · 0 评论 -
LeetCode 311 / LintCode 654 Sparse Matrix Multiplication
思路思路1:常规解法,直接三重循环,按照公式计算。时间复杂度O(n3n^3n3), 空间复杂度O(1)思路2:对A矩阵进行优化,如果值为0, 则不继续循环最内层循环来计算【这里将k循环提到了第二层】时间复杂度O(n2n^2n2~n3n^3n3), 空间复杂度O(1)思路3:进一步优化,提前将B中值不为0的元素的下标存到一个list中,在最内层的循环里就不需要每一次进行判断是否B为0,而是...原创 2019-03-31 15:22:14 · 182 阅读 · 0 评论 -
LeetCode 12 Integer to Roman
思路由于数字范围是1~3999,因此可以利用记录各个数字区间内的罗马数字字符串,然后在最后直接将每一位取出来:数位分离,组成一个字符串即可。复杂度时间复杂度O(1),空间复杂度O(1)代码public class Solution { /** * @param n: The integer * @return: Roman representation ...原创 2019-03-31 12:24:43 · 85 阅读 · 0 评论 -
LintCode 481 Binary Tree Leaf Sum
思路一道巨简单的题目,单纯想练习一下递归。复杂度时间复杂度O(n)空间复杂度最坏情况O(n)代码/** * Definition of TreeNode: * public class TreeNode { * public int val; * public TreeNode left, right; * public TreeNode(int va...原创 2019-03-17 13:37:11 · 167 阅读 · 0 评论 -
LintCode 526 Load Balancer
思路要求三个方法都是O(1)的时间复杂度使用一个HashMap存储server_id(key)和对应的index(value),可以使得put和remove的时间都为常数级使用一个ArrayList存储所有的server_id,方便通过索引随机pick一台服务器remove方法:在arraylist中删除元素,如果仅仅使用其自带的remove方法,时间复杂度为O(n), 因为相当于在数组中...原创 2019-03-17 13:20:24 · 395 阅读 · 0 评论 -
LintCode 486 Merge k Sorted Arrays
思路要求时间复杂度O(N logk)使用priorityqueue组成最小堆。堆的大小为k,首先将所有数组的第一个元素放进去,需要记录下是哪一个数组的第几个元素。然后每次从pq中拿出最小的元素加入答案序列,然后根据拿出来的那个元素的row和col,将与其同数组的下一个元素加入pq,保证pq的大小始终是k。【实现:可以新建一个class去存储每一个元素所在的row,col和val,然后对于pq...原创 2019-03-14 08:31:21 · 251 阅读 · 0 评论 -
LintCode 1380 Log Sorting (LeetCode 937 Reorder Log Files)
思路重写比较器对日志内容为字母的日志进行排序:其中可以调用String的compareTo方法,因为其返回值符合比较器的compare函数的返回值规则。具体实现:首先利用String的indexOf找到第一个空格的位置,然后就可以把原日志分成id与内容两个字符串。然后就可以按照规则进行比较了。主函数的实现:用一个list存字母型日志,方便后面直接调用sort方法排序。倒着遍历所有日志,遇到数...原创 2019-05-19 13:43:13 · 441 阅读 · 0 评论