自定义博客皮肤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

征服代码

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

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

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

原创 Word Break II -- LeetCode

原题链接: http://oj.leetcode.com/problems/word-break-ii/ 这道题目要求跟Word Break比较类似,不过返回的结果不仅要知道能不能break,如果可以还要返回所有合法结果。一般来说这种要求会让动态规划的效果减弱很多,因为我们要在过程中记录下所有的合法结果,中间的操作会使得算法的复杂度不再是动态规划的两层循环,因为每次迭代中还需要不是cons

2014-03-29 00:48:08 21803 31

原创 Plus One -- LeetCode

原题链接: http://oj.leetcode.com/problems/plus-one/ 这是一道比较简单的题目,对一个数组进行加一操作。但是可不要小看这个题,这个题被称为“Google最喜欢的题”,因为在google面试中出现的频率非常高。我们先说说这道题的解法。思路是维护一个进位,对每一位进行加一,然后判断进位,如果有继续到下一位,否则就可以返回了,因为前面不需要计算了。有一个小细节

2014-03-28 07:04:57 17516 6

原创 Word Break -- LeetCode

原题链接: http://oj.leetcode.com/problems/word-break/ 这道题仍然是动态规划的题目,我们总结一下动态规划题目的基本思路。首先我们要决定要存储什么历史信息以及用什么数据结构来存储信息。然后是最重要的递推式,就是如从存储的历史信息中得到当前步的结果。最后我们需要考虑的就是起始条件的值。接下来我们套用上面的思路来解这道题。首先我们要存储的历史信息res

2014-03-28 04:02:13 28045 17

原创 Minimum Path Sum -- LeetCode

原题链接: http://oj.leetcode.com/problems/minimum-path-sum/ 这道题跟Unique Paths,Unique Paths II是相同类型的。事实上,这道题是上面两道题的general版本,是寻找带权重的path。在Unique Paths中,我们假设每个格子权重都是1,而在Unique Paths II中我们假设障碍格子的权重是

2014-03-27 07:04:39 9252

原创 Insert Interval -- LeetCode

原题链接: http://oj.leetcode.com/problems/insert-interval/ 这道题跟Merge Intervals很类似,都是关于数据结构interval的操作。事实上,Merge Intervals是这道题的子操作,就是插入一个interval,如果出现冲突了,就进行merge。跟Merge Intervals不一样的是,这道题不需要排序,因为插

2014-03-27 01:15:48 11065 4

原创 Unique Paths II -- LeetCode

原题链接: http://oj.leetcode.com/problems/unique-paths-ii/ 这道题跟Unique Paths非常类似,只是这道题给机器人加了障碍,不是每次都有两个选择(向右,向下)了。因为有了这个条件,所以Unique Paths中最后一个直接求组合的方法就不适用了,这里最好的解法就是用动态规划了。递推式还是跟Unique Paths一样,只是每次

2014-03-26 04:15:28 11986 1

原创 Unique Paths -- LeetCode

原题链接: http://oj.leetcode.com/problems/unique-paths/ 这道题是比较典型的动态规划的题目。模型简单,但是可以考核动态规划的思想。我们先说说brute force的解法,比较容易想到用递归,到达某一格的路径数量等于它的上面和左边的路径数之和,结束条件是走到行或者列的边缘。因为每条路径都会重新探索,时间复杂度是结果数量的量级,不是多项式的复杂度。

2014-03-26 04:13:48 14271 2

原创 Permutation Sequence -- LeetCode

原题链接: http://oj.leetcode.com/problems/permutation-sequence/ 这道题目算法上没有什么特别的,更像是一道找规律的数学题目。我们知道,n个数的permutation总共有n阶乘个,基于这个性质我们可以得到某一位对应的数字是哪一个。思路是这样的,比如当前长度是n,我们知道每个相同的起始元素对应(n-1)!个permutation,也就是(n-

2014-03-25 06:41:17 12660

原创 Binary Tree Postorder Traversal -- LeetCode

原题链接: http://oj.leetcode.com/problems/binary-tree-postorder-traversal/ 跟Binary Tree Inorder Traversal以及Binary Tree Preorder Traversal一样,二叉树的后序遍历我们还是介绍三种方法,第一种是递归,第二种是迭代方法,第三种是用线索二叉树。 递归还是那么简单,算法

2014-03-25 01:10:09 14545 4

原创 Spiral Matrix II -- LeetCode

原题链接: http://oj.leetcode.com/problems/spiral-matrix-ii/ 这道题跟Spiral Matrix很类似,只是这道题是直接给出1到n^2,然后把这些数按照螺旋顺序放入数组中。思路跟Spiral Matrix还是一样的,就是分层,然后按照上右下左的顺序放入数组中。每个元素只访问一次,时间复杂度是O(n^2)。代码如下:public int[

2014-03-24 06:54:28 11019

原创 Rotate List -- LeetCode

原题链接: http://oj.leetcode.com/problems/rotate-list/ 这是一道链表操作的题目,基本思路是用walker-runner定位到要旋转的那个结点,然后将下一个结点设为新表头,并且把当前结点设为表尾。需要注意的点就是旋转的结点数可能超过链表长度,所以我们要对这个进行取余。定位旋转的尾结点的不超过链表的长度,所以时间复杂度是O(n),空间复杂度是O(1)。

2014-03-24 01:06:20 9101 4

原创 Length of Last Word -- LeetCode

原题链接: http://oj.leetcode.com/problems/length-of-last-word/ 这道题比较简单,就是进行一下字符串操作。唯一的细节就是要去掉尾部的空格,然后读到下一个空格,记录下长度。时间复杂度是O(n),n是字符串的长度,空间复杂度是O(1)。代码如下:public int lengthOfLastWord(String s) { if(s==n

2014-03-23 13:08:28 8184 3

原创 Merge Intervals -- LeetCode

原题链接: http://oj.leetcode.com/problems/merge-intervals/ 这是一道关于interval数组结构的操作,在面试中也是一种比较常见的数据结构。假设这些interval是有序的(也就是说先按起始点排序,然后如果起始点相同就按结束点排序),那么要把它们合并就只需要按顺序读过来,如果当前一个和结果集中最后一个有重叠,那么就把结果集中最后一个元素设为当前

2014-03-23 08:16:45 12535 8

原创 Reorder List -- LeetCode

原题链接: http://oj.leetcode.com/problems/reorder-list/这是一道比较综合的链表操作的题目,要按照题目要求给链表重新连接成要求的结果。其实理清思路也比较简单,分三步完成:(1)将链表切成两半,也就是找到中点,然后截成两条链表;(2)将后面一条链表进行reverse操作,就是反转过来;(3)将两条链表按顺序依次merge起来。这几个操作都是我们曾经

2014-03-22 12:24:51 8792

原创 Spiral Matrix -- LeetCode

原题链接: http://oj.leetcode.com/problems/spiral-matrix/ 这道题是比较简单的数组操作,按螺旋顺序把数组读取并且放到结果数组中即可。基本思路跟Rotate Image有点类似,就是一层一层的处理,每一层都是按照右下左上的顺序进行读取就可以。实现中要注意两个细节,一个是因为题目中没有说明矩阵是不是方阵,因此要先判断一下行数和列数来确定螺旋的层数。

2014-03-22 06:26:01 12143 5

原创 Rotate Image -- LeetCode

原题链接: http://oj.leetcode.com/problems/rotate-image/ 这道题虽然操作起来有一点繁琐,但是思路比较简单,就是考察一下数组的基本操作。基本思路是把图片分为行数/2层,然后一层层进行旋转,每一层有上下左右四个列,然后目标就是把上列放到右列,右列放到下列,下列放到左列,左列放回上列,中间保存一个临时变量即可。因为每个元素搬运的次数不会超过一次,时间复杂

2014-03-21 10:32:48 11092 3

原创 Anagrams -- LeetCode

原题链接: http://oj.leetcode.com/problems/anagrams/ 这是一道很经典的面试题了,在cc150里面也有,就是把一个数组按照易位构词分类。易位构词其实也很好理解,就是两个单词所包含的字符和数量都是一样的,只是顺序不同。这个题简单的版本是判断两个单词是不是anagram,一般来说有两种方法。第一种方法是用hashmap,key是字符,value是出现的次

2014-03-21 01:02:04 16963 11

原创 Jump Game II -- LeetCode

原题链接: http://oj.leetcode.com/problems/jump-game-ii/ 这道题是Jump Game的扩展,区别是这道题不仅要看能不能到达终点,而且要求到达终点的最少步数。其实思路和Jump Game还是类似的,只是原来的全局最优现在要分成step步最优和step-1步最优(假设当前步数是step)。当走到超过step-1步最远的位置时,说明step-1不

2014-03-20 23:25:59 16716 10

原创 Jump Game -- LeetCode

原题链接: http://oj.leetcode.com/problems/jump-game/ 这道题是动态规划的题目,所用到的方法跟是在Maximum Subarray中介绍的套路,用“局部最优和全局最优解法”。我们维护一个到目前为止能跳到的最远距离,以及从当前一步出发能跳到的最远距离。局部最优local=A[i]+i,而全局最优则是global=Math.max(global,

2014-03-20 09:54:58 18469 4

原创 Maximum Subarray -- LeetCode

原题链接: http://oj.leetcode.com/problems/maximum-subarray/ 这是一道非常经典的动态规划的题目,用到的思路我们在别的动态规划题目中也很常用,以后我们称为”局部最优和全局最优解法“。基本思路是这样的,在每一步,我们维护两个变量,一个是全局最优,就是到当前元素为止最优的解是,一个是局部最优,就是必须包含当前元素的最优的解。接下来说说动态规划的递

2014-03-20 09:24:41 29359 17

原创 Permutations II -- LeetCode

原题链接: http://oj.leetcode.com/problems/permutations-ii/ 这个题跟Permutations非常类似,唯一的区别就是在这个题目中元素集合可以出现重复。这给我们带来一个问题就是如果不对重复元素加以区别,那么类似于{1,1,2}这样的例子我们会有重复结果出现。那么如何避免这种重复呢?方法就是对于重复的元素循环时跳过递归函数的调用,只对第一个未被使用

2014-03-20 01:04:36 16037 9

原创 Permutations -- LeetCode

原题链接: http://oj.leetcode.com/problems/permutations/ 这道题跟N-Queens,Sudoku Solver,Combination Sum,Combinations等一样,也是一个NP问题。方法还是原来那个套路,还是用一个循环递归处理子问题。区别是这里并不是一直往后推进的,前面的数有可能放到后面,所以我们需要维护一个used数组来表示该

2014-03-20 00:44:12 18122 8

原创 LRU Cache -- LeetCode

原题链接: http://oj.leetcode.com/problems/lru-cache/ 这是一道非常综合的题目,主要应用在操作系统的资源管理中。按照题目要求,要实现get和set功能,为了满足随机存储的需求我们首先想到的一般是用数组,如果用链表会有O(n)的访问时间。然而他又有另一个条件就是要维护least used的队列,也就是说经常用的放在前面,用的少的放在后面。这样当资源超

2014-03-19 11:47:46 12438 11

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

原创 Linked List Cycle -- LeetCode

原题链接: http://oj.leetcode.com/problems/linked-list-cycle/ 这道题是cc150里面的题目,算是链表里面比较经典的题目。我们先讲一下比较直接容易想到的方法,就是用一个hashset,然后把扫过的结点放入hashset中,如果出现重复则返回true。想法比较简单,也很好实现,这里就不放代码了,有兴趣的朋友可以写写。下面我们来考虑如何不用

2014-03-19 04:54:01 7223 7

原创 Wildcard Matching -- LeetCode

原题链接: http://oj.leetcode.com/problems/wildcard-matching/ 这道题目其实是Regular Expression Matching的简化版,在这里'?'相当于那边的'.',而'*'相当于那边的'.*',因为这里'*'就可以代替任何字符串,不需要看前面的字符,所以处理起来更加简单。brute force的方法就不重新列举代码了,有兴趣实

2014-03-19 00:24:10 24930 19

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

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

原创 Candy -- LeetCode

原题链接: http://oj.leetcode.com/problems/candy/ 这道题用到的思路和Trapping Rain Water是一样的,用动态规划。基本思路就是进行两次扫描,一次从左往右,一次从右往左。第一次扫描的时候维护对于每一个小孩左边所需要最少的糖果数量,存入数组对应元素中,第二次扫描的时候维护右边所需的最少糖果数,并且比较将左边和右边大的糖果数量存入结果数组对应

2014-03-18 01:44:27 13889 3

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

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

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

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

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

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

原创 ZigZag Conversion -- LeetCode

原题链接: http://oj.leetcode.com/problems/zigzag-conversion/ 这道题是cc150里面的题目了,其实比较简单,只要看出来他其实每个zigzag是2*m-1个字符就可以,这里m是结果的行的数量。接下来就是对于每一行先把往下走的那一列的字符加进去,然后有往上走的字符再加进去即可。时间复杂度是O(n),空间复杂度是O(1),代码如下: public

2014-03-15 06:45:36 14765 3

原创 Combinations -- LeetCode

原题链接: http://oj.leetcode.com/problems/combinations/ 这道题是NP问题的题目,时间复杂度没办法提高,用到的还是N-Queens中的方法:用一个循环递归处理子问题。实现的代码跟Combination Sum非常类似而且更加简练,因为不用考虑重复元素的情况,而且元素只要到了k个就可以返回一个结果。代码如下:public ArrayList> c

2014-03-15 00:16:29 12445 1

空空如也

空空如也

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

TA关注的人

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