LeetCode
文章平均质量分 72
Code_Ganker
留美博士生一枚,四大爱好:创业,编程,dota,德扑。
展开
-
Generate Parentheses -- LeetCode
原题链接: http://oj.leetcode.com/problems/generate-parentheses/ 这道题其实是关于卡特兰数的,如果只是要输出结果有多少组,那么直接用卡特兰数的公式就可以。关于卡特兰数,请参见卡特兰数-维基百科,里面有些常见的例子,这个概念还是比较重要的,因为很多问题的原型其实都是卡特兰数,大家可以看看。特别是其中这个递推式的定义,很多这类问题都原创 2014-02-25 02:27:18 · 14375 阅读 · 18 评论 -
Median of Two Sorted Arrays -- LeetCode
原题链接: http://oj.leetcode.com/problems/median-of-two-sorted-arrays/ 这道题比较直接的想法就是用Merge Sorted Array这个题的方法把两个有序数组合并,当合并到第(m+n)/2个元素的时候返回那个数即可,而且不用把结果数组存起来。算法时间复杂度是O(m+n),空间复杂度是O(1)。因为代码比较简单,就不写出来了,跟原创 2014-02-25 11:26:33 · 15911 阅读 · 10 评论 -
Swap Nodes in Pairs -- LeetCode
原题链接: http://oj.leetcode.com/problems/swap-nodes-in-pairs/ 这道题属于链表操作的题目,思路比较清晰,就是每次跳两个节点,后一个接到前面,前一个接到后一个的后面,最后现在的后一个(也就是原来的前一个)接到下下个结点(如果没有则接到下一个)。代码如下: public ListNode swapPairs(ListNode head) {原创 2014-02-26 01:37:59 · 13637 阅读 · 6 评论 -
Add Two Numbers -- LeetCode
原题链接: http://oj.leetcode.com/problems/add-two-numbers/ 这道题比较简单,是cc150里面的题,思路很明确,就是按照位数读下去,维护当前位和进位,时间复杂度是O(n),空间复杂度是O(1).代码如下: public ListNode addTwoNumbers(ListNode l1, ListNode l2) { int car原创 2014-02-26 06:46:10 · 13476 阅读 · 3 评论 -
Reverse Nodes in k-Group -- LeetCode
原题链接: http://oj.leetcode.com/problems/reverse-nodes-in-k-group/ 这道题是Swap Nodes in Pairs的扩展,Swap Nodes in Pairs其实是这道题k=2的特殊情况,大家可以先练习一下。不过实现起来还是比较不一样的,因为要处理比较general的情形。基本思路是这样的,我们统计目前节点数量,如果到达k,原创 2014-02-26 06:27:12 · 12328 阅读 · 5 评论 -
Sqrt(x) -- LeetCode
原题链接: http://oj.leetcode.com/problems/sqrtx/ 这是一道数值处理的题目,和Divide Two Integers不同,这道题一般采用数值中经常用的另一种方法:二分法。基本思路是跟二分查找类似,要求是知道结果的范围,取定左界和右界,然后每次砍掉不满足条件的一半,知道左界和右界相遇。算法的时间复杂度是O(logx),空间复杂度是O(1)。代码如下:pu原创 2014-02-28 01:06:21 · 22095 阅读 · 18 评论 -
Valid Parentheses -- LeetCode
原题链接: http://oj.leetcode.com/problems/valid-parentheses/ 这道题思路比较简单,主要考察对栈数据结构的操作。遇到左括号就入栈,遇到右括号看栈顶左括号是否与当前右括号匹配,匹配继续,否则返回false。算法的时间复杂度是O(n),空间复杂度也是O(n)。代码如下: public boolean isValid(String s) {原创 2014-02-24 07:25:29 · 8291 阅读 · 8 评论 -
Next Permutation -- LeetCode
原题链接: http://oj.leetcode.com/problems/next-permutation/ 这道题是给定一个数组和一个排列,求下一个排列。算法上其实没有什么特别的地方,主要的问题是经常不是一见到这个题就能马上理清思路。下面我们用一个例子来说明,比如排列是(2,3,6,5,4,1),求下一个排列的基本步骤是这样:1) 先从后往前找到第一个不是依次增长的数,记录下位置p。比原创 2014-03-04 05:52:53 · 16821 阅读 · 6 评论 -
Longest Valid Parentheses -- LeetCode
原题链接: http://oj.leetcode.com/problems/longest-valid-parentheses/ 这道题是求最长的括号序列,比较容易想到用栈这个数据结构。基本思路就是维护一个栈,遇到左括号就进栈,遇到右括号则出栈,并且判断当前合法序列是否为最长序列。不过这道题看似思路简单,但是有许多比较刁钻的测试集。具体来说,主要问题就是遇到右括号时如何判断当前的合法序列的长度原创 2014-03-04 07:57:24 · 12655 阅读 · 3 评论 -
Search in Rotated Sorted Array -- LeetCode
原题链接: http://oj.leetcode.com/problems/search-in-rotated-sorted-array/ 这道题是二分查找Search Insert Position的变体,看似有点麻烦,其实理清一下还是比较简单的。因为rotate的缘故,当我们切取一半的时候可能会出现误区,所以我们要做进一步的判断。具体来说,假设数组是A,每次左边缘为l,右边缘为r,还有原创 2014-03-05 09:15:45 · 24576 阅读 · 15 评论 -
First Missing Positive -- LeetCode
原题链接: http://oj.leetcode.com/problems/first-missing-positive/ 这道题要求用线性时间和常量空间,思想借鉴到了Counting sort中的方法,不了解的朋友可以参见Counting sort - Wikipedia。既然不能用额外空间,那就只有利用数组本身,跟Counting sort一样,利用数组的index来作为数字本身的索引原创 2014-03-13 04:31:27 · 14125 阅读 · 14 评论 -
Combination Sum II -- LeetCode
原题链接: http://oj.leetcode.com/problems/combination-sum-ii/ 这道题跟Combination Sum非常相似,不了解的朋友可以先看看,唯一的区别就是这个题目中单个元素用过就不可以重复使用了。乍一看好像区别比较大,但是其实实现上只需要一点点改动就可以完成了,就是递归的时候传进去的index应该是当前元素的下一个。代码如下: publi原创 2014-03-13 04:30:39 · 17040 阅读 · 10 评论 -
Evaluate Reverse Polish Notation -- LeetCode
原题链接: http://oj.leetcode.com/problems/evaluate-reverse-polish-notation/ 这道题是逆波兰式的求解,不了解逆波兰式的朋友可以参考一下逆波兰表示法 - wiki。逆波兰式有个优点就是他不需要括号来表示优先级,直接根据式子本身就可以求解。思路是维护一个运算数栈,读到运算数的时候直接进栈,而每得到一个运算符,就从栈顶取出两个运算原创 2014-03-13 21:56:02 · 5956 阅读 · 0 评论 -
Combination Sum -- LeetCode
原题链接: http://oj.leetcode.com/problems/combination-sum/ 这个题是一个NP问题,方法仍然是N-Queens中介绍的套路。基本思路是先排好序,然后每次递归中把剩下的元素一一加到结果集合中,并且把目标减去加入的元素,然后把剩下元素(包括当前加入的元素)放到下一层递归中解决子问题。算法复杂度因为是NP问题,所以自然是指数量级的。代码如下: pu原创 2014-03-10 03:57:44 · 21694 阅读 · 10 评论 -
Sort List -- LeetCode
原题链接: http://oj.leetcode.com/problems/sort-list/ 这道题题目要求我们用O(nlogn)算法对链表进行排序,但是并没有要求用哪一种排序算法,我们可以使用归并排序,快速排序,堆排序等满足要求的方法来实现。对于这道题比较容易想到的是归并排序,因为我们已经做过Merge Two Sorted Lists,这是归并排序的一个subroutine。剩下我原创 2014-03-14 08:16:52 · 17254 阅读 · 20 评论 -
Integer to Roman -- LeetCode
原题链接: http://oj.leetcode.com/problems/integer-to-roman/ 这道题比较简单,只要搞清楚每个数字在每个位置应该如何表示就可以,罗马数字对于每个位有三个单位:1,5,10,对于1到9,表示方法如下:1-3:用1表示;4:1:5左边加一个1;5: 直接用5表示; 6-8: 5右边加相应的1;9: 10左边加一个1。以下的代码原创 2014-03-17 01:51:54 · 9391 阅读 · 4 评论 -
String to Integer (atoi) -- LeetCode
原题链接:http://oj.leetcode.com/problems/string-to-integer-atoi/ 这道题还是对于Integer的处理,在Reverse Integer这道题中我有提到,这种题的考察重点并不在于问题本身,而是要注意corner case的处理,整数一般有两点,一个是正负符号问题,另一个是整数越界问题。思路比较简单,就是先去掉多余的空格字符,然后读符号(原创 2014-03-16 00:55:41 · 12202 阅读 · 12 评论 -
Regular Expression Matching -- LeetCode
原题链接: http://oj.leetcode.com/problems/regular-expression-matching/ 这个题目比较常见,但是难度还是比较大的。我们先来看看brute force怎么解决。基本思路就是先看字符串s和p的从i和j开始的子串是否匹配,用递归的方法直到串的最后,最后回溯回来得到结果。假设现在走到s的i位置,p的j位置,情况分为下列两种: (1)p[j原创 2014-03-16 16:16:06 · 30840 阅读 · 24 评论 -
Palindrome Number -- LeetCode
原题链接: http://oj.leetcode.com/problems/palindrome-number/ 这道题跟Reverse Integer差不多,也是考查对整数的操作,相对来说可能还更加简单,因为数字不会变化,所以没有越界的问题。基本思路是每次去第一位和最后一位,如果不相同则返回false,否则继续直到位数为0。代码如下: public boolean isPalindrom原创 2014-03-16 04:06:06 · 10515 阅读 · 6 评论 -
Container With Most Water -- LeetCode
原题链接: http://oj.leetcode.com/problems/container-with-most-water/ 首先一般我们都会想到brute force的方法,思路很简单,就是对每一对pair都计算一次容积,然后去最大的那个,总共有n*(n-1)/2对pair,所以时间复杂度是O(n^2)。 接下来我们考虑如何优化。思路有点类似于Two Sum中的第二种方法--夹逼原创 2014-03-16 10:03:58 · 8938 阅读 · 2 评论 -
Word Break -- LeetCode
原题链接: http://oj.leetcode.com/problems/word-break/ 这道题仍然是动态规划的题目,我们总结一下动态规划题目的基本思路。首先我们要决定要存储什么历史信息以及用什么数据结构来存储信息。然后是最重要的递推式,就是如从存储的历史信息中得到当前步的结果。最后我们需要考虑的就是起始条件的值。接下来我们套用上面的思路来解这道题。首先我们要存储的历史信息res原创 2014-03-28 04:02:13 · 28045 阅读 · 17 评论 -
Plus One -- LeetCode
原题链接: http://oj.leetcode.com/problems/plus-one/ 这是一道比较简单的题目,对一个数组进行加一操作。但是可不要小看这个题,这个题被称为“Google最喜欢的题”,因为在google面试中出现的频率非常高。我们先说说这道题的解法。思路是维护一个进位,对每一位进行加一,然后判断进位,如果有继续到下一位,否则就可以返回了,因为前面不需要计算了。有一个小细节原创 2014-03-28 07:04:57 · 17516 阅读 · 6 评论 -
Candy -- LeetCode
原题链接: http://oj.leetcode.com/problems/candy/ 这道题用到的思路和Trapping Rain Water是一样的,用动态规划。基本思路就是进行两次扫描,一次从左往右,一次从右往左。第一次扫描的时候维护对于每一个小孩左边所需要最少的糖果数量,存入数组对应元素中,第二次扫描的时候维护右边所需的最少糖果数,并且比较将左边和右边大的糖果数量存入结果数组对应原创 2014-03-18 01:44:27 · 13890 阅读 · 3 评论 -
Binary Tree Preorder Traversal -- LeetCode
原题链接: http://oj.leetcode.com/problems/binary-tree-preorder-traversal/ 跟Binary Tree Inorder Traversal一样,二叉树的先序遍历我们仍然介绍三种方法,第一种是递归,第二种是迭代方法,第三种是用线索二叉树。递归是最简单的方法,算法的时间复杂度是O(n), 而空间复杂度则是递归栈的大小,即O(lo原创 2014-03-18 03:33:27 · 14545 阅读 · 13 评论 -
Roman to Integer -- LeetCode
原题链接: http://oj.leetcode.com/problems/roman-to-integer/ 这道题和Integer to Roman一样,也是整数和罗马数字的转换。思路也比较简单,就是维护一个整数,然后如果1下一个字符是对应位的5或者10则减对应位的1,否则加之。遇到5或者10就直接加上对应位的5或者10。时间复杂度是O(字符串的长度),空间复杂度是O(1)。代码如下:原创 2014-03-17 11:56:50 · 7930 阅读 · 4 评论 -
Longest Common Prefix -- LeetCode
原题链接: http://oj.leetcode.com/problems/longest-common-prefix/ 这道题属于字符串处理的题目,思路比较简单,就是brute force的想法,以第一个字符串为标准,对于每个字符串从第一个字符开始,看看是不是和标准一致,如果不同,则跳出循环返回当前结果,否则继续下一个字符。时间复杂度应该是O(m*n),m表示字符串的最大长度,n表示字符串的原创 2014-03-18 10:01:31 · 9980 阅读 · 6 评论 -
Path Sum -- LeetCode
原题链接: http://oj.leetcode.com/problems/path-sum/ 这道题是树操作的题目,判断是否从根到叶子的路径和跟给定sum相同的。还是用常规的递归方法来做,递归条件是看左子树或者右子树有没有满足条件的路径,也就是子树路径和等于当前sum减去当前节点的值。结束条件是如果当前节点是空的,则返回false,如果是叶子,那么如果剩余的sum等于当前叶子的值,则找到满足原创 2014-04-14 08:55:32 · 13620 阅读 · 5 评论 -
LRU Cache -- LeetCode
原题链接: http://oj.leetcode.com/problems/lru-cache/ 这是一道非常综合的题目,主要应用在操作系统的资源管理中。按照题目要求,要实现get和set功能,为了满足随机存储的需求我们首先想到的一般是用数组,如果用链表会有O(n)的访问时间。然而他又有另一个条件就是要维护least used的队列,也就是说经常用的放在前面,用的少的放在后面。这样当资源超原创 2014-03-19 11:47:46 · 12438 阅读 · 11 评论 -
Unique Binary Search Trees -- LeetCode
原题链接: http://oj.leetcode.com/problems/unique-binary-search-trees/ 这道题要求可行的二叉查找树的数量,其实二叉查找树可以任意取根,只要满足中序遍历有序的要求就可以。从处理子问题的角度来看,选取一个结点为根,就把结点切成左右子树,以这个结点为根的可行二叉树数量就是左右子树可行二叉树数量的乘积,所以总的数量是将以所有结点为根的可行结果原创 2014-04-30 06:16:29 · 23809 阅读 · 1 评论 -
Word Break II -- LeetCode
原题链接: http://oj.leetcode.com/problems/word-break-ii/ 这道题目要求跟Word Break比较类似,不过返回的结果不仅要知道能不能break,如果可以还要返回所有合法结果。一般来说这种要求会让动态规划的效果减弱很多,因为我们要在过程中记录下所有的合法结果,中间的操作会使得算法的复杂度不再是动态规划的两层循环,因为每次迭代中还需要不是cons原创 2014-03-29 00:48:08 · 21803 阅读 · 31 评论 -
Wildcard Matching -- LeetCode
原题链接: http://oj.leetcode.com/problems/wildcard-matching/ 这道题目其实是Regular Expression Matching的简化版,在这里'?'相当于那边的'.',而'*'相当于那边的'.*',因为这里'*'就可以代替任何字符串,不需要看前面的字符,所以处理起来更加简单。brute force的方法就不重新列举代码了,有兴趣实原创 2014-03-19 00:24:10 · 24930 阅读 · 19 评论 -
Balanced Binary Tree -- LeetCode
原题链接: http://oj.leetcode.com/problems/balanced-binary-tree/ 这道题是树操作的题目,还是老套路用递归。这道题是求解树是否平衡,还是有一些小技巧的。要判断树是否平衡,根据题目的定义,深度是比需的信息,所以我们必须维护深度,另一方面我们又要返回是否为平衡树,那么对于左右子树深度差的判断也是必要的。这里我们用一个整数来做返回值,而0或者正数用原创 2014-04-15 07:36:04 · 10406 阅读 · 0 评论 -
Copy List with Random Pointer -- LeetCode
原题链接: http://oj.leetcode.com/problems/copy-list-with-random-pointer/ 这是一道链表操作的题目,要求复制一个链表,不过链表的每个结点带有一个随机指针,指向某一个结点。我们先介绍一种比较直接的算法,思路是先按照复制一个正常链表的方式复制,复制的时候把复制的结点做一个HashMap,以旧结点为key,新节点为value。这么做的原创 2014-03-29 05:10:19 · 15690 阅读 · 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 · 13567 阅读 · 26 评论 -
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 · 18986 阅读 · 17 评论 -
Linked List Cycle II -- LeetCode
原题链接: http://oj.leetcode.com/problems/linked-list-cycle-ii/ 这道题是Linked List Cycle的扩展,就是在确定是否有cycle之后还要返回cycle的起始点的位置。从Linked List Cycle中用的方法我们可以得知a=kc-b(不了解的朋友可以先看看Linked List Cycle)。现在假设有两个结点原创 2014-03-19 04:54:43 · 7577 阅读 · 2 评论 -
Single Number II -- LeetCode
原题链接: http://oj.leetcode.com/problems/single-number-ii/ 这个题比较直接的想法是用一个HashMap对于出现的元素进行统计,key是元素,value是出现个数,如果元素出现三次,则从HashMap中移除,最后在HashMap剩下来的元素就是我们要求的元素(因为其他元素都出现三次,有且仅有一个元素不是如此)。这样需要对数组进行一次扫描,所以时原创 2014-03-31 09:01:47 · 11258 阅读 · 11 评论 -
Single Number -- LeetCode
原题链接: http://oj.leetcode.com/problems/single-number/ 这道题目跟Single Number II比较类似,区别只是这道题目每个元素出现两次,而不是三次。我们仍然可以按照Single Number II中的两种方法来,都只是把取余3改成取余2即可。我们就列举一下第二种方法的代码如下:public int singleNumber(int原创 2014-03-31 09:53:49 · 8495 阅读 · 1 评论 -
Path Sum II -- LeetCode
原题链接: http://oj.leetcode.com/problems/path-sum-ii/ 这道题是树的题目,跟Path Sum的要求很接近,都是寻找从根到叶子的路径。这道题目的要求是求所有满足条件的路径,所以我们需要数据结构来维护中间路径结果以及保存满足条件的所有路径。这里的时间复杂度仍然只是一次遍历O(n),而空间复杂度则取决于满足条件的路径和的数量(假设是k条),则空间是O原创 2014-04-14 23:59:49 · 14111 阅读 · 3 评论 -
Combinations -- LeetCode
原题链接: http://oj.leetcode.com/problems/combinations/ 这道题是NP问题的题目,时间复杂度没办法提高,用到的还是N-Queens中的方法:用一个循环递归处理子问题。实现的代码跟Combination Sum非常类似而且更加简练,因为不用考虑重复元素的情况,而且元素只要到了k个就可以返回一个结果。代码如下:public ArrayList> c原创 2014-03-15 00:16:29 · 12446 阅读 · 1 评论