LeetCode总结
文章平均质量分 74
本栏目主要针对网站LeetCode中的算法面试常见题进行j讲解和总结,先对其中题目进行一一分析,后面将对题目分为动态规划,树,图等分类进行概括式的讲解,可以对练习过的题目起到加深理解,举一反三的效果。
Code_Ganker
留美博士生一枚,四大爱好:创业,编程,dota,德扑。
展开
-
LeetCode总结 -- 树的遍历篇
遍历树的数据结构中最常见的操作, 可以说大部分关于树的题目都是围绕遍历进行变体来解决的。 一般来说面试中遇到树的题目是用递归来解决的, 不过如果直接考察遍历, 那么一般递归的解法就过于简单了, 面试官一般还会问更多问题, 比如非递归实现, 或者空间复杂度分析以及能否优化等等。 树的遍历题目在LeetCode中有以下几个: Binary Tree Inorder TraversalBinary Tr原创 2014-08-12 09:10:07 · 16741 阅读 · 9 评论 -
LeetCode总结 -- 一维动态规划篇
这篇文章的主题是动态规划, 主要介绍LeetCode中一维动态规划的题目, 列表如下: Climbing StairsDecode WaysUnique Binary Search TreesMaximum SubarrayBest Time to Buy and Sell Stock在介绍上述具体题目之前, 我们先说说动态规划的通常思路。 动态规划是一种算法思路(注意这里不要和递归混淆, 事实上原创 2014-08-10 11:16:12 · 33734 阅读 · 4 评论 -
LeetCode总结--二分查找篇
二分查找算法虽然简单,但面试中也比较常见,经常用来在有序的数列查找某个特定的位置。在LeetCode用到此算法的主要题目有:Search Insert PositionSearch for a RangeSqrt(x)Search a 2D MatrixSearch in Rotated Sorted ArraySearch in Rotated Sor原创 2014-06-16 10:50:14 · 24850 阅读 · 8 评论 -
4Sum -- LeetCode
原题链接: http://oj.leetcode.com/problems/4sum/ 这道题要求跟3Sum差不多,只是需求扩展到四个的数字的和了。我们还是可以按照3Sum中的解法,只是在外面套一层循环,相当于求n次3Sum。我们知道3Sum的时间复杂度是O(n^2),所以如果这样解的总时间复杂度是O(n^3)。代码如下:public ArrayList> fourSum(int[] num,原创 2014-05-01 04:13:26 · 23602 阅读 · 6 评论 -
Unique Binary Search Trees -- LeetCode
原题链接: http://oj.leetcode.com/problems/unique-binary-search-trees/ 这道题要求可行的二叉查找树的数量,其实二叉查找树可以任意取根,只要满足中序遍历有序的要求就可以。从处理子问题的角度来看,选取一个结点为根,就把结点切成左右子树,以这个结点为根的可行二叉树数量就是左右子树可行二叉树数量的乘积,所以总的数量是将以所有结点为根的可行结果原创 2014-04-30 06:16:29 · 23794 阅读 · 1 评论 -
Unique Binary Search Trees II -- LeetCode
原题链接: http://oj.leetcode.com/problems/unique-binary-search-trees-ii/ 这道题是求解所有可行的二叉查找树,从Unique Binary Search Trees中我们已经知道,可行的二叉查找树的数量是相应的卡特兰数,不是一个多项式时间的数量级,所以我们要求解所有的树,自然是不能多项式时间内完成的了。算法上还是用求解NP问题的原创 2014-04-30 06:15:46 · 18966 阅读 · 17 评论 -
Restore IP Addresses -- LeetCode
原题链接: http://oj.leetcode.com/problems/restore-ip-addresses/ 这道题的解法非常接近于NP问题,也是采用递归的解法。基本思路就是取出一个合法的数字,作为IP地址的一项,然后递归处理剩下的项。可以想象出一颗树,每个结点有三个可能的分支(因为范围是0-255,所以可以由一位两位或者三位组成)。并且这里树的层数不会超过四层,因为IP地址由四段组原创 2014-04-29 05:01:34 · 14367 阅读 · 3 评论 -
Interleaving String -- LeetCode
原题链接: http://oj.leetcode.com/problems/interleaving-string/ 这是一道关于字符串操作的题目,要求是判断一个字符串能不能由两个字符串按照他们自己的顺序,每次挑取两个串中的一个字符来构造出来。像这种判断能否按照某种规则来完成求是否或者某个量的题目,很容易会想到用动态规划来实现。先说说维护量,res[i][j]表示用s1的前i个字符和s原创 2014-04-29 04:28:30 · 10605 阅读 · 12 评论 -
Reverse Linked List II -- LeetCode
原题链接: http://oj.leetcode.com/problems/reverse-linked-list-ii/ 这道题是比较常见的链表反转操作,不过不是反转整个链表,而是从m到n的一部分。分为两个步骤,第一步是找到m结点所在位置,第二步就是进行反转直到n结点。反转的方法就是每读到一个结点,把它插入到m结点前面位置,然后m结点接到读到结点的下一个。总共只需要一次扫描,所以时间是O(n原创 2014-04-28 04:58:33 · 14756 阅读 · 3 评论 -
Subsets II -- LeetCode
原题链接: http://oj.leetcode.com/problems/subsets-ii/这道题跟Subsets一样是经典的NP问题--求子集。比Subsets稍微复杂一些的是这里的集合中可能出现重复元素,因此我们在求子集的时候要避免出现重复的子集。在Subsets中我们每次加进一个元素就会把原来的子集都加上这个元素,然后再加入到结果集中,但是这样重复的元素就会产生重复的子集。为了避免原创 2014-04-28 04:23:53 · 12837 阅读 · 6 评论 -
Decode Ways -- LeetCode
原题链接: http://oj.leetcode.com/problems/decode-ways/ 这道题要求解一个数字串按照字符串编码方式可解析方式的数量。看到这种求数量的,我们很容易想到动态规划来存储前面信息,然后迭代得到最后结果。我们维护的量res[i]是表示前i个数字有多少种解析的方式,接下来来想想递归式,有两种方式:第一种新加进来的数字不然就是自己比较表示一个字符,那么解析的方原创 2014-04-27 06:18:13 · 15671 阅读 · 6 评论 -
Recover Binary Search Tree -- LeetCode
原题链接: http://oj.leetcode.com/problems/recover-binary-search-tree/ 这道题是要求恢复一颗有两个元素调换错了的二叉查找树。一开始拿到可能会觉得比较复杂,其实观察出规律了就比较简单。主要还是利用二叉查找树的主要性质,就是中序遍历是有序的性质。那么如果其中有元素被调换了,意味着中序遍历中必然出现违背有序的情况。那么会出现几次呢?有两种情原创 2014-04-27 03:09:51 · 16792 阅读 · 5 评论 -
Gray Code -- LeetCode
原题链接: http://oj.leetcode.com/problems/gray-code/ 这道题要求求出n位的格雷码对应的二进制数,主要在于找到一种格雷码的递增方法(格雷码并不是唯一的,可以有多种)。我们来看看有了n-1位的格雷码如何得到n位的格雷码呢?其实方法比较简单,首先在n-1位的格雷码前面都添加0作为前2^(n-1)个格雷码,它们一定是合法的因为除了第一位(都是0)其余位都原创 2014-04-26 06:22:42 · 10676 阅读 · 2 评论 -
Binary Tree Zigzag Level Order Traversal -- LeetCode
原题链接: http://oj.leetcode.com/problems/binary-tree-zigzag-level-order-traversal/ 这道题其实还是树的层序遍历Binary Tree Level Order Traversal,如果不熟悉的朋友可以先看看哈。不过这里稍微做了一点变体,就是在遍历的时候偶数层自左向右,而奇数层自右向左。在Binary Tree L原创 2014-04-26 04:31:29 · 14738 阅读 · 8 评论 -
Scramble String -- LeetCode
原题链接: http://oj.leetcode.com/problems/scramble-string/ 这道题看起来是比较复杂的,如果用brute force,每次做切割,然后递归求解,是一个非多项式的复杂度,一般来说这不是面试官想要的答案。这其实是一道三维动态规划的题目,我们提出维护量res[i][j][n],其中i是s1的起始字符,j是s2的起始字符,而n是当前的字符串长度,re原创 2014-04-26 02:50:20 · 15659 阅读 · 5 评论 -
Partition List -- LeetCode
原题链接: http://oj.leetcode.com/problems/partition-list/ 这是一道链表操作的题目,要求把小于x的元素按顺序放到链表前面。我们仍然是使用链表最常用的双指针大法,一个指向当前小于x的最后一个元素,一个进行往前扫描。如果元素大于x,那么继续前进,否则,要把元素移到前面,并更新第一个指针。这里有一个小细节,就是如果不需要移动(也就是已经是接在小于x的最原创 2014-04-25 04:51:26 · 9855 阅读 · 0 评论 -
Maximal Rectangle -- LeetCode
原题链接: http://oj.leetcode.com/problems/maximal-rectangle/ 这是一道非常综合的题目,要求在0-1矩阵中找出面积最大的全1矩阵。刚看到这道题会比较无从下手,brute force就是对于每个矩阵都看一下,总共有m(m+1)/2*n(n+1)/2个子矩阵(原理跟字符串子串类似,字符串的子串数有n(n+1)/2,只是这里是二维情形,所以是两个相乘原创 2014-04-25 02:30:11 · 16091 阅读 · 7 评论 -
Construct Binary Tree from Inorder and Postorder Traversal -- LeetCode
原题链接: http://oj.leetcode.com/problems/construct-binary-tree-from-inorder-and-postorder-traversal/ 这道题和Construct Binary Tree from Preorder and Inorder Traversal思路完全一样,如果有朋友不了解,请先看看Construct Binar原创 2014-04-24 09:02:17 · 13813 阅读 · 1 评论 -
Construct Binary Tree from Preorder and Inorder Traversal -- LeetCode
原题链接: http://oj.leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/ 这道题是树中比较有难度的题目,需要根据先序遍历和中序遍历来构造出树来。这道题看似毫无头绪,其实梳理一下还是有章可循的。下面我们就用一个例子来解释如何构造出树。假设树的先序遍历是12453687,中序原创 2014-04-24 08:43:09 · 19544 阅读 · 11 评论 -
Remove Duplicates from Sorted List II -- LeetCode
原题链接: http://oj.leetcode.com/problems/remove-duplicates-from-sorted-list-ii/ 这道题跟Remove Duplicates from Sorted List比较类似,只是这里要把出现重复的元素全部删除。其实道理还是一样,只是现在要把前驱指针指向上一个不重复的元素中,如果找到不重复元素,则把前驱指针知道该元素,否则删除原创 2014-04-24 08:33:10 · 11859 阅读 · 1 评论 -
Remove Duplicates from Sorted List -- LeetCode
原题链接: http://oj.leetcode.com/problems/remove-duplicates-from-sorted-list/ 这是一道比较简单的链表操作的题目,要求是删去有序链表中重复的元素。方法比较清晰,维护两个指针,一个指向当前不重复的最后一个元素,一个进行依次扫描,遇到不重复的则更新第一个指针,继续扫描,否则就把前面指针指向当前元素的下一个(即把当前元素从链表中删除原创 2014-04-23 11:25:06 · 10135 阅读 · 1 评论 -
Remove Duplicates from Sorted Array II -- LeetCode
原题链接: http://oj.leetcode.com/problems/remove-duplicates-from-sorted-array-ii/ 这道题跟Remove Duplicates from Sorted Array比较类似,区别只是这里元素可以重复出现至多两次,而不是一次。其实也比较简单,只需要维护一个counter,当counter是2时,就直接跳过即可,否则说明元素原创 2014-04-23 08:39:29 · 12775 阅读 · 2 评论 -
Word Search -- LeetCode
原题链接: http://oj.leetcode.com/problems/word-search/ 这道题很容易感觉出来是图的题目,其实本质上还是做深度优先搜索。基本思路就是从某一个元素出发,往上下左右深度搜索是否有相等于word的字符串。这里注意每次从一个元素出发时要重置访问标记(也就是说虽然单次搜索字符不能重复使用,但是每次从一个新的元素出发,字符还是重新可以用的)。深度优先搜索的算法就原创 2014-04-23 01:21:12 · 20034 阅读 · 12 评论 -
Subsets -- LeetCode
原题链接: http://oj.leetcode.com/problems/subsets/ 求子集问题是经典的NP问题,复杂度上我们就无法强求了哈,肯定是非多项式量级的。一般来说这个问题有两种解法:递归和非递归。我们先来说说递归解法,主要递推关系就是假设函数返回递归集合,现在加入一个新的数字,我们如何得到包含新数字的所有子集。其实就是在原有的集合中对每集合中的每个元素都加入新元素得到子集原创 2014-04-22 08:08:48 · 14181 阅读 · 2 评论 -
Sort Colors -- LeetCode
原题链接: http://oj.leetcode.com/problems/sort-colors/ 这道题也是数组操作的题目,其实就是要将数组排序,只是知道数组中只有三个元素0,1,2。熟悉计数排序的朋友可能很快就发现这其实就是使用计数排序,元素空间只需要三个元素即可。代码如下: public void sortColors(int[] A) { if(A==null || A.le原创 2014-04-22 08:06:02 · 12152 阅读 · 0 评论 -
Search a 2D Matrix -- LeetCode
原题链接: http://oj.leetcode.com/problems/search-a-2d-matrix/ 这道题是二分查找Search Insert Position的题目,因为矩阵是行有序并且列有序,查找只需要先按行查找,定位出在哪一行之后再进行列查找即可,所以就是进行两次二分查找。时间复杂度是O(logm+logn),空间上只需两个辅助变量,因而是O(1),代码如下:publ原创 2014-04-21 02:29:21 · 13948 阅读 · 10 评论 -
Edit Distance -- LeetCode
原题链接: http://oj.leetcode.com/problems/edit-distance/ 这道题求一个字符串编辑成为另一个字符串的最少操作数,操作包括添加,删除或者替换一个字符。这道题难度是比较大的,用常规思路出来的方法一般都是brute force,而且还不一定正确。这其实是一道二维动态规划的题目,模型上确实不容易看出来,下面我们来说说递推式。我们维护的变量res[i][原创 2014-04-21 01:43:21 · 11948 阅读 · 16 评论 -
Set Matrix Zeroes -- LeetCode
原题链接: http://oj.leetcode.com/problems/set-matrix-zeroes/ 这是一个矩阵操作的题目,目标很明确,就是如果矩阵如果有元素为0,就把对应的行和列上面的元素都置为0。这里最大的问题就是我们遇到0的时候不能直接把矩阵的行列在当前矩阵直接置0,否则后面还没访问到的会被当成原来是0,最后会把很多不该置0的行列都置0了。一个直接的想法是备份一个矩阵,原创 2014-04-19 00:26:44 · 12424 阅读 · 1 评论 -
Text Justification -- LeetCode
原题链接: http://oj.leetcode.com/problems/text-justification/ 这道题属于纯粹的字符串操作,要把一串单词安排成多行限定长度的字符串。主要难点在于空格的安排,首先每个单词之间必须有空格隔开,而当当前行放不下更多的单词并且字符又不能填满长度L时,我们要把空格均匀的填充在单词之间。如果剩余的空格量刚好是间隔倍数那么就均匀分配即可,否则还必须把多的一原创 2014-04-19 00:00:12 · 13752 阅读 · 9 评论 -
Climbing Stairs -- LeetCode
原题链接: http://oj.leetcode.com/problems/climbing-stairs/ 这道题目是求跑楼梯的可行解法数量。每一步可以爬一格或者两个楼梯,可以发现,递推式是f(n)=f(n-1)+f(n-2),也就是等于前一格的可行数量加上前两格的可行数量。熟悉的朋友可能发现了,这个递归式正是斐波那契数列的定义,不熟悉的朋友可以看看Wiki - 斐波那契数列。根据这个定原创 2014-04-18 00:54:46 · 11422 阅读 · 9 评论 -
Simplify Path -- LeetCode
原题链接: http://oj.leetcode.com/problems/simplify-path/ 这道题目是Linux内核中比较常见的一个操作,就是对一个输入的文件路径进行简化。思路比较明确,就是维护一个栈,对于每一个块(以‘/’作为分界)进行分析,如果遇到‘../’则表示要上一层,那么就是进行出栈操作,如果遇到‘./’则是停留当前,直接跳过,其他文件路径则直接进栈即可。最后根据栈中的原创 2014-04-17 23:42:06 · 11155 阅读 · 1 评论 -
Convert Sorted List to Binary Search Tree -- LeetCode
原题链接: http://oj.leetcode.com/problems/convert-sorted-list-to-binary-search-tree/ 这个题是二分查找树的题目,要把一个有序链表转换成一棵二分查找树。其实原理还是跟Convert Sorted Array to Binary Search Tree这道题相似,我们需要取中点作为当前函数的根。这里的问题是对于一个链表原创 2014-04-17 07:57:02 · 19104 阅读 · 16 评论 -
Convert Sorted Array to Binary Search Tree -- LeetCode
原题链接: http://oj.leetcode.com/problems/convert-sorted-array-to-binary-search-tree/ 这道题是二分查找树的题目,要把一个有序数组转换成一颗二分查找树。其实从本质来看,如果把一个数组看成一棵树(也就是以中点为根,左右为左右子树,依次下去)数组就等价于一个二分查找树。所以如果要构造这棵树,那就是把中间元素转化为根,然后递原创 2014-04-17 07:56:34 · 16454 阅读 · 5 评论 -
Validate Binary Search Tree -- LeetCode
原题链接: http://oj.leetcode.com/problems/validate-binary-search-tree/ 这道题是检查一颗二分查找树是否合法,二分查找树是非常常见的一种数据结构,因为它可以在O(logn)时间内实现搜索。这里我们介绍两种方法来解决这个问题。第一种是利用二分查找树的性质,就是它的中序遍历结果是按顺序递增的。根据这一点我们只需要中序遍历这棵树,然后保原创 2014-04-16 04:34:52 · 13564 阅读 · 12 评论 -
Valid Number -- LeetCode
原题链接: http://oj.leetcode.com/problems/valid-number/ 这是一道检查字符串输入是否为合法的题目。基本规则是按照科学计数法,所以会出现的特殊字符有以下几个:符号位‘+’,‘-’,小数点‘.’,还有‘e’和‘E’,剩下的就只有数字0-9了,其他字符如果出现就是非法字符,返回false。数字字符在哪里出现都是ok的,我们主要考虑几个特殊字符的情况。原创 2014-04-16 04:04:47 · 10675 阅读 · 18 评论 -
Balanced Binary Tree -- LeetCode
原题链接: http://oj.leetcode.com/problems/balanced-binary-tree/ 这道题是树操作的题目,还是老套路用递归。这道题是求解树是否平衡,还是有一些小技巧的。要判断树是否平衡,根据题目的定义,深度是比需的信息,所以我们必须维护深度,另一方面我们又要返回是否为平衡树,那么对于左右子树深度差的判断也是必要的。这里我们用一个整数来做返回值,而0或者正数用原创 2014-04-15 07:36:04 · 10351 阅读 · 0 评论 -
Flatten Binary Tree to Linked List -- LeetCode
原题链接: http://oj.leetcode.com/problems/flatten-binary-tree-to-linked-list/ 这是树的题目,要求把一颗二叉树按照先序遍历顺序展成一个链表,不过这个链表还是用树的结果,就是一直往右走(没有左孩子)来模拟链表。老套路还是用递归来解决,维护先序遍历的前一个结点pre,然后每次把pre的左结点置空,右结点设为当前结点。这里需要注意的原创 2014-04-15 01:03:20 · 13534 阅读 · 26 评论 -
Path Sum II -- LeetCode
原题链接: http://oj.leetcode.com/problems/path-sum-ii/ 这道题是树的题目,跟Path Sum的要求很接近,都是寻找从根到叶子的路径。这道题目的要求是求所有满足条件的路径,所以我们需要数据结构来维护中间路径结果以及保存满足条件的所有路径。这里的时间复杂度仍然只是一次遍历O(n),而空间复杂度则取决于满足条件的路径和的数量(假设是k条),则空间是O原创 2014-04-14 23:59:49 · 14092 阅读 · 3 评论 -
Path Sum -- LeetCode
原题链接: http://oj.leetcode.com/problems/path-sum/ 这道题是树操作的题目,判断是否从根到叶子的路径和跟给定sum相同的。还是用常规的递归方法来做,递归条件是看左子树或者右子树有没有满足条件的路径,也就是子树路径和等于当前sum减去当前节点的值。结束条件是如果当前节点是空的,则返回false,如果是叶子,那么如果剩余的sum等于当前叶子的值,则找到满足原创 2014-04-14 08:55:32 · 13583 阅读 · 5 评论 -
Distinct Subsequences -- LeetCode
原题链接: http://oj.leetcode.com/problems/distinct-subsequences/ 这道题应该很容易感觉到是动态规划的题目。还是老套路,先考虑我们要维护什么量。这里我们维护res[i][j],对应的值是S的前i个字符和T的前j个字符有多少个可行的序列(注意这道题是序列,不是子串,也就是只要字符按照顺序出现即可,不需要连续出现)。下面来看看递推式,假设我们现原创 2014-04-13 09:19:57 · 10336 阅读 · 9 评论