my leetcode answers.
updating...
# | title | Solution | Time | Space | Difficulty | Tag | Note |
---|---|---|---|---|---|---|---|
24 | Swap Nodes in Pairs | C++ | O(n) | O(1) | easy | ||
61 | Rotate List | C++ | O(n) | O(1) | easy | 先变成循环链表再断开 | |
82 | Remove Duplicates from Sorted List II | C++ | O(n) | O(1) | medium | 把有重复的元素都删除 | |
83 | Remove Duplicates from Sorted List | C++ | O(n) | O(1) | easy | 删除重复的结点,只保留一个 |
# | title | Solution | Time | Space | Difficulty | Tag | Note |
---|---|---|---|---|---|---|---|
307 | Range Sum Query - Mutable | C++ | ctor :O(n) ,update : O(logn) , sum : O(logn) | O(n) | medium | 线段树 | |
24 | Longest Univalue Path | C++ | O(n) | O(h) | easy | dfs | |
654 | Maximum Binary Tree | C++ | O(n) | O(n) | medium | ||
652 | Find Duplicate Subtrees | C++ | O(n) | O(n) | medium | ||
684 | Redundant Connection | C++ | O(n) | O(n) | medium |
# | title | Solution | Time | Space | Difficulty | Tag | Note |
---|---|---|---|---|---|---|---|
1 | Two Sum | C++ | O(n) | O(n) | easy | ||
3 | Longest Substring Without Repeating Characters | C++ | O(n) | O(n) | medium | ||
36 | Valid Sudoku | C++ | O(n^2) | O(n) | medium | ||
159 | Longest Substring with At Most Two Distinct Characters | C++ | O(n) | O(n) | hard | ||
202 | Happy Number | C++ | O(k) | O(k) | easy | ||
323 | Number of Connected Components in an Undirected Graph | C++ | O(n) | O(n) | medium | ||
356 | Line Reflection | C++ | O(n) | O(n) | medium | ||
387 | First Unique Character in a String | C++ | O(n) | O(n) | easy | ||
737 | Sentence Similarity II | C++ | O(n) | O(n) | medium | 并查集,字符串在map里的位置作为并查集的查询条件 | |
734 | Sentence Similarity | C++ | O(n) | O(n) | easy | ||
721 | Accounts Merge | C++ | O(n) | O(n) | medium | 1. 并查集 2. email-name,email-id,set[id]-emails, name-emails | |
554 | Brick Wall | C++ | O(n) | O(n) | medium | 记录每一行右边界出现的次数,从长度减去它就是最少要穿过的数目 | |
457 | 4Sum II | C++ | O(n^2) | O(n^2) | medium | 统计前两个数组两两元素的和并统计次数,再和后两个进行比较 | |
lintcode | Find the Weak Connected Component in the Directed Graph | C++ | O(n^2) | O(n^2) | medium | 并查集 |
# | title | Solution | Time | Space | Difficulty | Tag | Note |
---|---|---|---|---|---|---|---|
362 | Sliding Window Maximum | C++ | O(n) | O(n) | medium | lintcode | deque |
122 | Largest Rectangle in Histogram | C++ | O(n) | O(n) | medium | lintcode | |
126 | Max Tree | C++ | O(n) | O(n) | hard | lintcode | decending stack |
367 | Expression Tree Build | C++ | O(n) | O(n) | medium | lintcode |
|1||C++|O(n)|O(n)|medium|lintcode||
# | title | Solution | Time | Space | Difficulty | Tag | Note |
---|---|---|---|---|---|---|---|
130 | Heapify | C++ | O(n) | O(n) | medium | lintcode | Heap |
364 | Trapping Rain Water II | C++ | O(mn(logm+logn) | O(m*n) | hard | lintcode | |
81 | Data Stream Median | C++ | O(nlogn) | O(n) | hard | lintcode | two heap |
|1||C++|O(n)|O(n)|medium|lintcode||
# | title | Solution | Time | Space | Difficulty | Tag | Note |
---|---|---|---|---|---|---|---|
134 | LRU Cache | C++ | O(1) | O(k) | hard | lintcode |
|1||C++|O(n)|O(n)|medium|lintcode||
# | title | Solution | Time | Space | Difficulty | Tag | Note |
---|---|---|---|---|---|---|---|
13 | Roman to Integer | C++ | O(n) | O(1) | easy | ||
12 | Integer to Roman | C++ | O(n) | O(1) | medium | ||
400 | Nth Digit | C++ | O(lgn) | O(1) | easy |
# | title | Solution | Time | Space | Difficulty | Tag | Note |
---|---|---|---|---|---|---|---|
88 | Merge Sorted Array | C++ | O(n) | O(1) | easy | 从后向前插入 | |
147 | Insertion Sort List | C++ | O(n) | O(n) | medium | 找到要插入位置的节点,再插入 | |
75 | Sort Colors | C++ | O(n) | O(1) | medium | 把数组分为三个部分,0 ,1,2 | |
88 | Merge Sorted Array | C++ | O(n) | O(1) | easy | 从后向前遍历两个数组 | |
148 | Sort List | C++ | O(nlgn) | O(lgn) | medium | 先把两个链表拆成两个链表,递归两个指针合并两链表 | |
179 | Largest Number | C++ | O(nlogn) | O(1) | medium | 通过将两个数字组合成一个字符串形式对数字按照askii进行排序,再将字符串依次组合成一个数字 | |
274 | H-Index | C++ | O(n) | O(n) | medium | 1、排序,找论文数大于引用数的 2、用一个数组记录引用数是0到n(大于n的记为n)之间被引用的文章有多少,再进行累加 | |
347 | Top K Frequent Elements | C++ | O(nlogn) | O(n) | medium | 按照元素的数量分成若干个捅,从后向前从捅中取元素 | |
451 | Sort Characters By Frequency | C++ | O(n) | O(n) | medium | 与上题类似 | |
692 | Top K Frequent Words | C++ | O(nlgn) | O(n) | medium |
# | title | Solution | Time | Space | Difficulty | Tag | Note |
---|---|---|---|---|---|---|---|
19 | Remove Nth Node From End of List | C++ | O(n) | O(1) | easy | 快慢指针,快指针先走n步,再同时开始走 | |
86 | Partition List | C++ | O(n) | O(1) | medium | 双指针。用两个指针分别表示比x大和小的两个链表,最后将小表的尾指向大表的头 | |
141 | Linked List Cycle | C++ | O(n) | O(1) | easy | 快慢指针 | |
142 | Linked List Cycle II | C++ | O(n) | O(n) | medium | fast在相遇点再走k步到达循环链表的起点,与从头开始走k步同一个位置 | |
143 | Reorder List | C++ | O(n) | O(1) | medium | 1、快慢指针分拆链表 2、后半部分reverse 3、再合并两个链表 | |
283 | Move Zeroes | C++ | O(n) | O(1) | easy | 从前向后遍历,设置一个标记元素,如果不是零则和后面的元素交换并自增标记元素,是零则不自增,这样零的会跑到最后 | |
287 | Find the Duplicate Number | C++ | O(n) | O(n) | medium | ||
344 | Reverse String | C++ | O(n) | O(1) | easy | 前指针和后指针不断交换直到相遇 | |
345 | Reverse Vowels of a String | C++ | O(n) | O(1) | easy | 细节:aeiou字符串弄成const string 2、比对时都用小写 | |
349 | Intersection of Two Arrays | C++ | O(n + m) | O(n + m) | easy | 1、哈希法:将第一个数组放入set中,遍历第二个数据 2、对两个数组排序再同事比对 | |
567 | Permutation in String | C++ | O(n) | O(n) | medium | 利用哈希表将第一个字符串的的元素都存起来,再遍历第二个字符串,在第一个字符串长度大小的窗口里检查是否全部出现了哈希表里字符。注意字符串哈表使用vector count(256)而不是vector | |
363 | Trapping Rain Water | C++ | O(n) | O(1) | medium | lintcode |
|1||C++|O(n)|O(n)|medium|lintcode||
# | title | Solution | Time | Space | Difficulty | Tag | Note |
---|---|---|---|---|---|---|---|
100 | Same Tree | C++ | O(n) | O(h) | easy | 当都为空则停止迭代返回true,否则迭代 | |
104 | Maximum Depth of Binary Tree | C++ | O(n) | O(n) | easy | 注意停止条件 | |
110 | Balanced Binary Tree | C++ | O(n) | O(h) | easy | 左子树和右子树高度是否相差1 | |
111 | Minimum Depth of Binary Tree | C++ | O(n) | O(h) | easy | ||
129 | Sum Root to Leaf Numbers | C++ | O(n) | O(h) | medium | 使用辅助函数,用0作为和 。停止条件:如果是空则return 0 ,如果左子树和右子树都不存在,则返回当前结点的值 ,其他情况递归左子树和右子树。 | |
298 | Binary Tree Longest Consecutive Sequence | C++ | O(n) | O(h) | medium | ||
669 | Trim a Binary Search Tree | C++ | O(n) | O(h) | easy | 如果当前结点值小于L或大于R,则递归返回右子树或左子树,再分别递归左子树和右子树 | |
108 | Convert Sorted Array to Binary Search Tree | C++ | O(n) | O(h) | easy | 二分法构建BST | |
98 | Validate Binary Search Tree | C++ | O(n) | O(h) | medium | 递归,设置上下边界的值,注意边界值设置成numeric_limits::max() min() | |
105 | Construct Binary Tree from Preorder and Inorder Traversal | C++ | O(n) | O(n) | medium | 构造一个map记录中序中的序号,从该序号以前是左子树,以后是右子树 | |
106 | Construct Binary Tree from Inorder and Postorder Traversal | C++ | O(n) | O(n) | medium | 同上构造一个map,递归创建左子树和右子树 | |
109 | Convert Sorted List to Binary Search Tree | C++ | O(n) | O(n) | medium | 使用快慢指针找到中间节点,中间节点的左子树从开始到中间节点的构造的bst,右子树是从中间节点的一下个节点到最后节点构造的bst。 | |
114 | Flatten Binary Tree to Linked List | C++ | O(n) | O(n) | medium | 将左子树放在右子树的位置上,并将原来的右子树放在新右子树的右子树 | |
404 | Sum of Left Leaves | C++ | O(n) | O(h) | easy | 构造辅助函数,加入适否是左子树标记。如果叶子结点(左右子树为空),如果是左子树,则返回叶子的值,否则返回0,递归左子树和右子树 | |
437 | Path Sum III | C++ | O(n^2) | O(h) | easy | 辅助函数记录当前的值,再去遍历左子树和右子树 | |
671 | Second Minimum Node In a Binary Tree | C++ | O(n^2) | O(n) | medium | 使用辅助函数,以及set存储(里面元素是从小到大排列的)当前节点的值,如果set>2则删除末尾的结点,便利左子树和右子树。则此时set保存了所有节点中最小的两个值,取后面的那个即可 | |
116 | Populating Next Right Pointers in Each Node | C++ | O(n) | O(log n) | medium | 如果是空则退出,如果存在左子树则把左子树的next指向右子树,如果存在右子树且存在next,则右子树的next指向next的左子树 | |
1 | C++ | O(n) | O(n) | medium |
# | title | Solution | Time | Space | Difficulty | Tag | Note |
---|---|---|---|---|---|---|---|
34 | Search for a Range | C++ | O(logn) | O(1) | medium | 二分法 | |
35 | Search Insert Position | C++ | O(n^2) | O(n) | medium | 二分法 | |
69 | Sqrt(x) | C++ | O(logn) | O(1) | medium | 二分法判断sqrt,注意的是边界值 | |
74 | Search a 2D Matrix | C++ | O(logm+logn) | O(1) | medium | 看成一个一维数组,二分法 | |
33 | Search in Rotated Sorted Array | C++ | O(logn) | O(1) | medium | 每次在有序的那一半元素里找,抛弃另一半元素 | |
81 | Search in Rotated Sorted Array II | C++ | O(logn) | O(1) | medium | 如果nums[left] == nums[mid] 则++left | |
162 | Find Peak Element | C++ | O(n) | O(n) | medium | 二分法中间值大于后面那个元素则证明前面一部分一定有极值(因为o是无穷小)否则右边一定有极值 | |
153 | Find Minimum in Rotated Sorted Array | C++ | O(n) | O(n) | medium | 如果没有旋转则是最左边的元素,如果有旋转,则找乱序里面最左边的元素 | |
154 | Find Minimum in Rotated Sorted Array II | C++ | O(n) | O(n) | medium | 如果mid和左边相同则left ++ ,判断一开始是否乱序时条件是nums[left] <= nums[right] | |
278 | First Bad Version | C++ | O(logn) | O(1) | easy |
# | title | Solution | Time | Space | Difficulty | Tag | Note |
---|---|---|---|---|---|---|---|
230 | Kth Smallest Element in a BST | C++ | O(max(h,k)) | O(h) | medium | 把元素从根节点到左子树开始入栈,从最小元素开始出栈,直到第k个最小元素为止 | |
235 | Lowest Common Ancestor of a Binary Search Tree | C++ | O(h) | O(1) | easy | 公共祖先的值一定是比小的元素大,比大的元素小,按照这个要求去遍历即可 | |
450 | Delete Node in a BST | C++ | O(h) | O(h) | medium | 左子树为空右子树为空都不为空三种情况,都不为空时将右子树中最小的点变为替换结点 | |
285 | Inorder Successor in BST | C++ | O(h) | O(1) | medium | 如果有右子树,则找右子树中最左边的结点,如果没有右子树,则找大于当前结点的右子树的最左结点 | |
270 | Closest Binary Search Tree Value | C++ | O(h) | O(1) | easy | 两个变量gap和closet,不断遍历左子树找最小的gap的closet值 |
|201|Segment Tree Build|C++|O(n)|O(n)|medium|lintcode|segment tree , BST| |202|Segment Tree Query|C++|O(lgn)|O(1)|medium|lintcode|segment tree , BST| |203|[Segment Tree Modify](Segment Tree Modify)|C++|O(lgn)|O(1)|medium|lintcode|segment tree , BST| |205|Interval Minimum Number|C++|O(logn)|O(logn)|medium|lintcode|segment tree 的应用|
|1||C++|O(n)|O(n)|medium|lintcode||
# | title | Solution | Time | Space | Difficulty | Tag | Note |
---|---|---|---|---|---|---|---|
102 | Binary Tree Level Order Traversal | C++ | O(n) | O(n) | easy | 层序遍历广度优先,使用一个队列遍历当前层元素,把当前层元素的左子树和右子树放在队列中的后面 | |
103 | Binary Tree Zigzag Level Order Traversal | C++ | O(n) | O(n) | medium | 与上题相同,多加一个判断是否reverse | |
117 | Populating Next Right Pointers in Each Node II | C++ | O(n) | O(1) | medium | 记录prev、curr、next三个结点,双层遍历,外层遍历遍历所有层,内层设置每个子节点的next | |
133 | Clone Graph | C++ | O(n) | O(n) | medium | 广度优先遍历,使用队列保存当前遍历的结点,使用map保存原图和新图的结点映射,遍历时判断原来是否已经遍历过此节点,如果已经遍历过只更新neighbour,没有的话加入映射并更新neighbour | |
207 | Course Schedule | C++ | O(V + E) | O(E) | medium | 拓扑排序图使用二维数组表示,再用数组保存每个节点的入度,把入度为0的节点放入队列中,遍历图。遍历到的点入度减1,入度为0则放入队列,看最后是否还有入度不为0的点 | |
210 | Course Schedule II | C++ | O(V + E) | O(E) | medium | 与上题类似,把入度为0的点依次加入结果集中即可 | |
261 | Graph Valid Tree | C++ | O(n) | O(n) | medium | 可以使用并查集。图是有效的树:1、没有环 2、是连通的 ,其中2等价于图节点数等于边数减一 | |
127 | Word Ladder | C++ | O(n) | O(n) | medium | BFS 每次遍历当前队列中的元素,当变换字母时加入新的队列中 |
# | title | Solution | Time | Space | Difficulty | Tag | Note |
---|---|---|---|---|---|---|---|
112 | Path Sum | C++ | O(n) | O(h) | easy | 递归,停止条件:root为空或者是叶子节点且值等于sum | |
113 | Path Sum II | C++ | O(n) | O(h) | medium | 记录迭代的路径经过的点,把当前节点的值先放进去,如果满足sum则放入结果集,再pop出当前元素 | |
199 | Binary Tree Right Side View | C++ | O(n) | O(h) | medium | 用一个数字来表示当前所在的层,每层只放一个节点,如果结果集数目小于当前层数则把当前节点放进去,先遍历右子树再遍历左子树 | |
236 | Lowest Common Ancestor of a Binary Tree | C++ | O(n) | O(n) | medium | 如果左子树和右子树里都有目标节点则root是lca | |
200 | Number of Islands | C++ | O(m*n) | O(m*n) | medium | 遍历每个值,如果是island则dfs更新周围的点为water | |
257 | Binary Tree Paths | C++ | O(n*h) | O(h) | easy | dfs 当前路径和结果集 |
- 定义一个解空间,它包含问题的解 2) 用适于搜索的方式组织该空间 3) 用深度优先法搜索该空间,利用限界函数避免移动到不可能产生解的子空间。
# | title | Solution | Time | Space | Difficulty | Tag | Note |
---|---|---|---|---|---|---|---|
78 | Subsets | C++ | O(n * 2^n) | O(1) | medium | 遍历每个元素的时候,找到每个元素所在的子集并添加到结果集里 | |
39 | Combination Sum | C++ | O(k * n^k) | O(k) | medium | dfs,先给候选元素排序,再记录每次循环的位置避免重复 |
|1||C++|O(n)|O(n)|medium|||
Combination Sum