自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Code Ganker

征服代码

  • 博客(169)
  • 收藏
  • 关注

原创 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 13962 10

原创 Edit Distance -- LeetCode

原题链接: http://oj.leetcode.com/problems/edit-distance/ 这道题求一个字符串编辑成为另一个字符串的最少操作数,操作包括添加,删除或者替换一个字符。这道题难度是比较大的,用常规思路出来的方法一般都是brute force,而且还不一定正确。这其实是一道二维动态规划的题目,模型上确实不容易看出来,下面我们来说说递推式。我们维护的变量res[i][

2014-04-21 01:43:21 11979 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 12473 1

原创 Text Justification -- LeetCode

原题链接: http://oj.leetcode.com/problems/text-justification/ 这道题属于纯粹的字符串操作,要把一串单词安排成多行限定长度的字符串。主要难点在于空格的安排,首先每个单词之间必须有空格隔开,而当当前行放不下更多的单词并且字符又不能填满长度L时,我们要把空格均匀的填充在单词之间。如果剩余的空格量刚好是间隔倍数那么就均匀分配即可,否则还必须把多的一

2014-04-19 00:00:12 13798 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 11431 9

原创 Simplify Path -- LeetCode

原题链接: http://oj.leetcode.com/problems/simplify-path/ 这道题目是Linux内核中比较常见的一个操作,就是对一个输入的文件路径进行简化。思路比较明确,就是维护一个栈,对于每一个块(以‘/’作为分界)进行分析,如果遇到‘../’则表示要上一层,那么就是进行出栈操作,如果遇到‘./’则是停留当前,直接跳过,其他文件路径则直接进栈即可。最后根据栈中的

2014-04-17 23:42:06 11217 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 19131 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 16498 5

原创 Validate Binary Search Tree -- LeetCode

原题链接: http://oj.leetcode.com/problems/validate-binary-search-tree/ 这道题是检查一颗二分查找树是否合法,二分查找树是非常常见的一种数据结构,因为它可以在O(logn)时间内实现搜索。这里我们介绍两种方法来解决这个问题。第一种是利用二分查找树的性质,就是它的中序遍历结果是按顺序递增的。根据这一点我们只需要中序遍历这棵树,然后保

2014-04-16 04:34:52 13618 12

原创 Valid Number -- LeetCode

原题链接: http://oj.leetcode.com/problems/valid-number/ 这是一道检查字符串输入是否为合法的题目。基本规则是按照科学计数法,所以会出现的特殊字符有以下几个:符号位‘+’,‘-’,小数点‘.’,还有‘e’和‘E’,剩下的就只有数字0-9了,其他字符如果出现就是非法字符,返回false。数字字符在哪里出现都是ok的,我们主要考虑几个特殊字符的情况。

2014-04-16 04:04:47 10685 18

原创 Balanced Binary Tree -- LeetCode

原题链接: http://oj.leetcode.com/problems/balanced-binary-tree/ 这道题是树操作的题目,还是老套路用递归。这道题是求解树是否平衡,还是有一些小技巧的。要判断树是否平衡,根据题目的定义,深度是比需的信息,所以我们必须维护深度,另一方面我们又要返回是否为平衡树,那么对于左右子树深度差的判断也是必要的。这里我们用一个整数来做返回值,而0或者正数用

2014-04-15 07:36:04 10406

原创 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

原创 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

原创 Path Sum -- LeetCode

原题链接: http://oj.leetcode.com/problems/path-sum/ 这道题是树操作的题目,判断是否从根到叶子的路径和跟给定sum相同的。还是用常规的递归方法来做,递归条件是看左子树或者右子树有没有满足条件的路径,也就是子树路径和等于当前sum减去当前节点的值。结束条件是如果当前节点是空的,则返回false,如果是叶子,那么如果剩余的sum等于当前叶子的值,则找到满足

2014-04-14 08:55:32 13620 5

原创 Distinct Subsequences -- LeetCode

原题链接: http://oj.leetcode.com/problems/distinct-subsequences/ 这道题应该很容易感觉到是动态规划的题目。还是老套路,先考虑我们要维护什么量。这里我们维护res[i][j],对应的值是S的前i个字符和T的前j个字符有多少个可行的序列(注意这道题是序列,不是子串,也就是只要字符按照顺序出现即可,不需要连续出现)。下面来看看递推式,假设我们现

2014-04-13 09:19:57 10420 9

原创 Populating Next Right Pointers in Each Node II -- LeetCode

原题链接: http://oj.leetcode.com/problems/populating-next-right-pointers-in-each-node-ii/ 这道题目的要求和Populating Next Right Pointers in Each Node是一样的,只是这里的二叉树没要求是完全二叉树。其实在实现Populating Next Right Pointer

2014-04-13 09:09:24 9673

原创 Populating Next Right Pointers in Each Node -- LeetCode

原题链接: http://oj.leetcode.com/problems/populating-next-right-pointers-in-each-node/ 这道题是要将一棵树的每一层维护成一个链表,树本身是给定的。其实思路上很接近层序遍历Binary Tree Level Order Traversal,只是这里不需要额外维护一个队列。因为这里每一层我们会维护成一个链表,这个链表

2014-04-12 03:11:29 11002 1

原创 Binary Tree Level Order Traversal II -- LeetCode

原题链接: http://oj.leetcode.com/problems/binary-tree-level-order-traversal-ii/ 这道题和Binary Tree Level Order Traversal很类似,都是层序遍历一棵树,只是这道题要求从最底层往最上层遍历。这道题我没有想到什么好的做法可以一次的自底向上进行层序遍历,能想到的就是进行Binary Tree

2014-04-11 06:21:49 9556 6

原创 Binary Tree Level Order Traversal -- LeetCode

原题链接: http://oj.leetcode.com/problems/binary-tree-level-order-traversal/ 这道题要求实现树的层序遍历,其实本质就是把树看成一个有向图,然后进行一次广度优先搜索,这个图遍历算法是非常常见的,这里同样是维护一个队列,只是对于每个结点我们知道它的邻接点只有可能是左孩子和右孩子,具体就不仔细介绍了。算法的复杂度是就结点的数量,O(

2014-04-11 01:48:49 14404 17

原创 Pascal's Triangle II -- LeetCode

原题链接: http://oj.leetcode.com/problems/pascals-triangle-ii/ 这道题跟Pascal's Triangle很类似,只是这里只需要求出某一行的结果。Pascal's Triangle中因为是求出全部结果,所以我们需要上一行的数据就很自然的可以去取。而这里我们只需要一行数据,就得考虑一下是不是能只用一行的空间来存储结果而不需要额外的来存

2014-04-10 00:56:53 14320 1

原创 Pascal's Triangle -- LeetCode

原题链接: http://oj.leetcode.com/problems/pascals-triangle/ 这道题比较简单,属于基础的数组操作。基本思路是每层保存前一行的指针,然后当前航数据根据上一行来得到,每个元素就是上一行两个相邻元素相加(第一个和最后一个元素是1)。算法时间复杂度应该是O(1+2+3+...+n)=O(n^2),空间上只需要二维数组来存储结果,不需要额外空间。代码如下

2014-04-10 00:56:26 13755 2

原创 Best Time to Buy and Sell Stock III -- LeetCode

原题链接: http://oj.leetcode.com/problems/best-time-to-buy-and-sell-stock-iii/ 这道题是Best Time to Buy and Sell Stock的扩展,现在我们最多可以进行两次交易。我们仍然使用动态规划来完成,事实上可以解决非常通用的情况,也就是最多进行k次交易的情况。这里我们先解释最多可以进行k次交易的算法,

2014-04-09 05:34:05 46642 60

原创 Best Time to Buy and Sell Stock II -- LeetCode

原题链接: http://oj.leetcode.com/problems/best-time-to-buy-and-sell-stock-ii/ 这道题跟Best Time to Buy and Sell Stock类似,求最大利润。区别是这里可以交易无限多次(当然我们知道交易不会超过n-1次,也就是每天都进行先卖然后买)。既然交易次数没有限定,可以看出我们只要对于每次两天差价大于0的都

2014-04-09 05:33:51 11042

原创 Best Time to Buy and Sell Stock -- LeetCode

原题链接: http://oj.leetcode.com/problems/best-time-to-buy-and-sell-stock/ 这道题求进行一次交易能得到的最大利润。如果用brute force的解法就是对每组交易都看一下利润,取其中最大的,总用有n*(n-1)/2个可能交易,所以复杂度是O(n^2)。很容易感觉出来这是动态规划的题目,其实跟Maximum Subarra

2014-04-09 05:33:32 21282 4

原创 Triangle -- LeetCode

原题链接: http://oj.leetcode.com/problems/triangle/这是一道动态规划的题目,求一个三角形二维数组从顶到低端的最小路径和。思路是维护到某一个元素的最小路径和,那么在某一个元素i,j的最小路径和就是它上层对应的相邻两个元素的最小路径和加上自己的值,递推式是sum[i][j]=min(sum[i-1][j-1],sum[i-1][j])+triangle[i

2014-04-09 02:52:23 12920 15

原创 Symmetric Tree -- LeetCode

原题链接: http://oj.leetcode.com/problems/symmetric-tree/ 这道题是树的题目,本质上还是树的遍历。这里无所谓哪种遍历方式,只需要对相应结点进行比较即可。一颗树对称其实就是看左右子树是否对称,一句话就是左同右,右同左,结点是对称的相等。题目中也要求了递归和非递归的解法,关于这个我们已经介绍过很多次了,不了解的朋友可以看看Binary Tree

2014-04-07 04:52:23 9697 5

原创 Word Ladder II -- LeetCode

原题链接: http://oj.leetcode.com/problems/word-ladder-ii/ 这道题是LeetCode中AC率最低的题目,确实是比较难。一方面是因为对时间有比较严格的要求(容易超时),另一方面是它有很多细节需要实现。思路上和Word Ladder是比较类似的,但是因为是要求出所有路径,仅仅保存路径长度是不够的,而且这里还有更多的问题,那就是为了得到所有路径,不

2014-04-07 04:34:11 19840 11

原创 Word Ladder -- LeetCode

原题链接: http://oj.leetcode.com/problems/word-ladder/ 这道题看似一个关于字符串操作的题目,其实要解决这个问题得用图的方法。我们先给题目进行图的映射,顶点则是每个字符串,然后两个字符串如果相差一个字符则我们进行连边。接下来看看这个方法的优势,注意到我们的字符集只有小写字母,而且字符串长度固定,假设是L。那么可以注意到每一个字符可以对应的边则有25个

2014-04-06 15:10:30 21849 9

原创 Binary Tree Maximum Path Sum -- LeetCode

原题链接: http://oj.leetcode.com/problems/binary-tree-maximum-path-sum/ 这道题是求树的路径和的题目,不过和平常不同的是这里的路径不仅可以从根到某一个结点,而且路径可以从左子树某一个结点,然后到达右子树的结点,就像题目中所说的可以起始和终结于任何结点。在这里树没有被看成有向图,而是被当成无向图来寻找路径。因为这个路径的灵活性,我们需

2014-04-05 02:19:00 19703 15

原创 Longest Consecutive Sequence -- LeetCode

原题链接: http://oj.leetcode.com/problems/longest-consecutive-sequence/ 这道题是要求出最长的整数连续串。我们先说说简单直接的思路,就是先排序,然后做一次扫描,记录当前连续串长度,如果连续串中断,则比较是否为当前最长连续串,并且把当前串长度置0。这样时间复杂度是很明确,就是排序的复杂度加上一次线性扫描。如果不用特殊的线性排序算法,复

2014-04-05 00:11:16 11015 3

原创 Sum Root to Leaf Numbers -- LeetCode

原题链接: http://oj.leetcode.com/problems/sum-root-to-leaf-numbers/ 这是一道树的题目,一般使用递归来做,主要就是考虑递归条件和结束条件。这道题思路还是比较明确的,目标是把从根到叶子节点的所有路径得到的整数都累加起来,递归条件即是把当前的sum乘以10并且加上当前节点传入下一函数,进行递归,最终把左右子树的总和相加。结束条件的话就是如果

2014-04-04 09:20:44 10396

原创 Surrounded Regions -- LeetCode

原题链接: http://oj.leetcode.com/problems/surrounded-regions/ 这个题目用到的方法是图形学中的一个常用方法:Flood fill算法,其实就是从一个点出发对周围区域进行目标颜色的填充。背后的思想就是把一个矩阵看成一个图的结构,每个点看成结点,而边则是他上下左右的相邻点,然后进行一次广度或者深度优先搜索。接下来我们看看这个题如何用Flo

2014-04-04 01:12:07 17503 26

原创 Same Tree -- LeetCode

原题链接: http://oj.leetcode.com/problems/same-tree/ 这道题是树的题目,属于最基本的树遍历的问题。问题要求就是判断两个树是不是一样,基于先序,中序或者后序遍历都可以做完成,因为对遍历顺序没有要求。这里我们主要考虑一下结束条件,如果两个结点都是null,也就是到头了,那么返回true。如果其中一个是null,说明在一棵树上结点到头,另一棵树结点还没结束

2014-04-03 04:07:01 10614 3

原创 Palindrome Partitioning II -- LeetCode

原题链接: http://oj.leetcode.com/problems/palindrome-partitioning-ii/ 这道题跟Palindrome Partitioning非常类似,区别就是不需要返回所有满足条件的结果,而只是返回最小的切割数量就可以。做过Word Break的朋友可能马上就会想到,其实两个问题非常类似,当我们要返回所有结果(Palindrome Pa

2014-04-03 02:31:13 11223 6

原创 Palindrome Partitioning -- LeetCode

原题链接: http://oj.leetcode.com/problems/palindrome-partitioning/ 这道题是求一个字符串中回文子串的切割,并且输出切割结果,其实是Word Break II和Longest Palindromic Substring结合,该做的我们都做过了。首先我们根据Longest Palindromic Substring重大方法建立一

2014-04-02 08:44:17 12618 8

原创 Valid Palindrome -- LeetCode

原题链接: http://oj.leetcode.com/problems/valid-palindrome/ 这道题是判断一个字符串是不是回文串。因为只是看一个字符串,算法还是比较简单,就是从两头出发,往中间走,进行两两匹配。这里面的小问题就是在这个题目要求中,只判断字母和数字类型的字符,其他字符直接跳过即可。因此我们要写一个函数判断他是不是合法字符,而且因为忽略大小写,我们在判断两个字符是

2014-04-02 07:05:57 11462 2

原创 Clone Graph -- LeetCode

原题链接: http://oj.leetcode.com/problems/clone-graph/ 这道题是LeetCode中为数不多的关于图的题目,不过这道题还是比较基础,就是考察图非常经典的方法:深度优先搜索和广度优先搜索。这道题用两种方法都可以解决,因为只是一个图的复制,用哪种遍历方式都可以。具体细节就不多说了,因为两种方法太常见了。这里恰好可以用旧结点和新结点的HashMap来做vi

2014-04-01 09:53:23 15715 12

原创 Gas Station -- LeetCode

原题链接: http://oj.leetcode.com/problems/gas-station/ 这是一道具体问题的题目,brute force的方法比较容易想到,就是从每一个站开始,一直走一圈,累加过程中的净余的油量,看它是不是有出现负的,如果有则失败,从下一个站开始重新再走一圈;如果没有负的出现,则这个站可以作为起始点,成功。可以看出每次需要扫描一圈,对每个站都要做一次扫描,所以时间复

2014-04-01 04:05:53 8486 3

原创 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

原创 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

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除