- 博客(72)
- 资源 (10)
- 收藏
- 关注
原创 [LeetCode] Binary Tree Postorder Traversal [42]
题目Binary Tree Postorder Traversal Total Accepted: 23797 Total Submissions: 76975My SubmissionsGiven a binary tree, return the postorder traversal of its nodes' values.For examp
2014-07-31 20:46:22 770
原创 [LeetCode] Combinations [38]
题目Given two integers n and k, return all possible combinations of k numbers out of 1 ... n.For example,If n = 4 and k = 2, a solution is:[ [2,4], [3,4], [2,3], [1,2], [1,3],
2014-06-14 17:46:45 1061
原创 [LeetCode] Word Search [37]
给一个二维字符数组,给一个字符串,问该二维数组是否包含该字符串。比如一个二维数组[ ABCE SFCS ADEE ]和字符串"ABCCED",这个就包含。解决这个问题,主要的关键是怎么解决在二维数组中查找方向,如何来标识哪些是走过的。代码如下
2014-06-14 17:24:07 1123
原创 [LeetCode] Search in Rotated Sorted Array II [36]
题目Follow up for "Search in Rotated Sorted Array":What if duplicates are allowed?Would this affect the run-time complexity? How and why?Write a function to determine if a given target is in the array.原题链接(点我)解题思路这题和Search in Rotated Sorted Array问题类似,
2014-06-13 15:16:39 972
原创 [LeetCode] Search in Rotated Sorted Array [35]
旋转数组中的查找。[1, 2, 3, 4, 5, 6]的一个旋转数组为[4, 5, 6, 1, 2, 3]。在旋转数组中寻找一个数。最直接的方法,一次遍历,时间复杂度O(n)。但是既然是一个部分有序的数组,那么对于有序的部分我们可以想方法用二分查找。这个效率可以提高。代码:....
2014-06-13 11:57:59 1125
原创 [LeetCode] Search for a Range [34]
题目Given a sorted array of integers, find the starting and ending position of a given target value.解题思路:查找一个数出现的范围,给一个排好序的数组和一个数,找出这个数在数组中出现的范围。这个题直接使用一次遍历就可以得到结果,这样的时间复杂度为O(n)。但是对于有序数组我们一般可以使用二分查找可以得到更好的O(logn)的时间复杂度。我们可以使用二分查找找到这个数第一次出现的位置和这个数最后一次出现的位
2014-06-13 11:14:01 1156
原创 [LeetCode] Decode Ways [33]
题目A message containing letters from A-Z is being encoded to numbers using the following mapping:原题链接(点我)解题思路及代码;解码方法数量问题。英文26个字母对应1到26,给一串数字,问翻译为字母有多少种方法?这个题第一思路是想到使用组合排列的方法,穷举所有的可能。很好,写出如下代码...但是提交后出来的结果是超时。再想想,使用动态规划的方法来做。对于串s[0...i]的解码数量应该和s[0..
2014-06-12 11:55:23 1300
原创 [LeetCode] Subsets II [32]
题目Given a collection of integers that might contain duplicates, S, return all possible subsets.原题链接(点我)解题思路这个题很subsets这个题一样,不过这里允许给出的集合中含有重复元素,对于这个条件之需要加一个判断条件就可以了,其余代码和Subsets都一样。代码实现....
2014-06-12 10:16:02 1139
原创 [LeetCode] Subsets [31]
题目Given a set of distinct integers, S, return all possible subsets.原题链接(点我)解题思路子集合问题。给一个集合 ,求出其所有的子集合。这个题也是个组合问题--老思路:递归加循环。代码实现...
2014-06-12 09:59:19 1041
原创 [LeetCode] Interleaving String [30]
题目:交差字符串。给3个字符串s1, s2, s3,判断s3是不是由s1和s2组成的交叉字符串。设s1长度为m, s2长度为n,判断 s3[0...m+n-1] 是不是由s1[0...m-1], s2[0...n-1]组成的交叉字符串,假设s1[m-1] == s3[m+n-1],则只需判断s3[0...m+n-2]是不是由s1[0...m-2], s2[0...n-1]组成的交叉字符串...,依次这样判断下去。从这可以总结,这个问题可以划分为比它小的问题,这里使用动态规划应该比较合适。dp[i][j]
2014-06-11 14:59:54 1237
原创 [LeetCode] Distinct Subsequences [29]
解题思路题目:Given a string S and a string T, count the number of distinct subsequences of T in S。解题思路:给两个字符串S和T, 求在字符串S中删除某些字符后得到T,问一共能有多少种删除方法?这个题用常规方法超时。得用动态规划,动态规划最主要的就是要找到动态规划方程。首先记:dp[i][j] 为 从S[0..j-1]中删除某些字符后得 T[0...i-1]的不同删除方法数量。动态规划方程为: dp[i][j]
2014-06-11 12:12:44 1144
原创 [LeetCode] Restore IP Address [28]
给一个字符串,将其转换成IP地址。这个题可以理解成,将字符串切割成若干个小块,将其中合法的(数值在0-255)组合起来,拼接成一个合法的IP地址。说到这也就看出来了这还是一个组合问题,对于组合问题,算法都是结构性的递归套循环,看如下循环:
2014-06-11 09:45:03 1262
原创 [LeetCode] Remove Duplicates from Sorted Array II [27]
移除数组中重复次数超过2次以上出现的数,但是可以允许重复2次。这个题类似Remove Duplicates from Sorted Array,第一个想法很直接就是计数,超过2次的就忽略,依据这个思路的代码见代码一;上面的思路可行,但是代码看着比较冗余,判断比较多。再来想想原来的数组,该数组是排好序的,如果一个数出现3次以上,那么必有A[i] == A[i-2]。所以根据这个关系可以写出比较精简的代码二。详见代码。
2014-06-10 11:53:33 1096
原创 [LeetCode] Rotate Image [26]
题目:...解题思路:顺时针方向旋转数组90°。这个题也是个没啥意思的题,自己画画图,找找规律。就出来了。我举一个n=4的例子还说明下规律:通过图可以看出A[0][0] = A[3][0],....。从这些中我们可以找到如下规律: A[i][j] = A[n-1-j][i]; A[n-1-j][i] = A[n-1-i][n-1-j]; A[n-1-i][n-1-j] = A[j][n-1-i]; A[j][n-1-i] = A[i][j];(原来的A[i][j
2014-06-10 10:42:58 1214
原创 [LeetCode] Search a 2D Matrix [25]
题目...二维数组中的查找,这是个简单的题,根据题意可以推出,这个二维数组其实是一个有序的一维数组。解决思路也很容易想到,每次比较每一维最后一个元素,如果该元素比要找的元素小,说明这个行不可能含该元素;如果相等,那就找到了,如果最后一个元素比要找元素大,说明该元素如果出现比在这一行。然后再在这一行中就行查找(可以用顺序,也可二分)。代码如下:
2014-06-09 11:36:19 1005
原创 [LeetCode] Climbing Stairs [24]
解题思路:爬楼梯:一次可以爬1阶或者2阶,问爬n阶楼梯有多少方法?这是个典型的斐波拉切应用场景,我们下面来分析下:对于1阶,只有 1 种方法, 记为f(1);对于2阶,记为f(2): 最后一步只爬1阶,有 f(1); 最后一步一次爬2阶,即一步上来,这是1中方法; 综合下来 f(2) = f(1) +1 = 2;对于3阶,记为f(3): 最有一步只爬1阶,有f(2)种方法 最后一步一次爬2阶,有f(1)种方法; 综合下来 f(3) = f
2014-06-09 11:10:39 1198
原创 [LeetCode] Sort Colors [23]
一个数组,数组元素含有3种颜色,红,白,蓝。要求将数组排序,将相同颜色排在一起,整体按照红白蓝的顺序。这个题在日常生活中很常见。比如要将东西归类,当然这个题简化成了相同颜色就认为完全相同。基于这个特点,可以先统计各个颜色出现的次数,然后在按照题目要求的红白蓝的顺序,依次放n个红,m个白,k个蓝,就Okay了,代码详见代码一。这个思路也就是题目下面提示的方法,这个方法需遍历2次数组,本题要求遍历一次就搞定的方法,想想这个还是有点难度的。这个题目其实我们很容易就能联想到快排的划分上来,但是仔细一想,如果按
2014-06-08 22:19:22 1028
原创 [LeetCode] Merge Sorted Array [22]
题目:Given two sorted integer arrays A and B, merge B into A as one sorted array.原题链接(点我)解题思路:合并两个数组为一个有序数组,这题也很简单,唯一考查的地方就是怎么处理数组,是从前往后还是从后往前。一般情况,从后往前的效率比从前往后高,也要省不少事。代码如下,从后开始合并。代码实现:
2014-06-08 16:56:45 1105
原创 [LeetCode] Search Insert Position [21]
解题思路给一个排序数组和一个数,寻找该数在数组的位置或者插入位置。本题考查的还是二分查找。二分查找返回的结果就是该数在数组中该插入的位置。代码实现
2014-06-08 16:14:45 1019
原创 [LeetCode] Remove Element [20]
题目Given an array and a value, remove all instances of that value in place and return the new length.The order of elements can be changed. It doesn't matter what you leave beyond the new length.原题链接(点我)解题思路给一个数组和一个数字,移除该数字在数组中所有出现的地方。这是一个非常简单的题目,应
2014-06-07 18:08:24 1000
原创 [LeetCode] Remove Duplicates from Sorted Array [19]
题目...For example,Given input array A = [1,1,2],Your function should return length = 2, and A is now [1,2].解题思路,移除数组中的重复元素,并返回新数组的长度。这个题目应该算是简单的题目。使用两个变量就可以。具体的看代码代码实现...
2014-06-07 17:46:56 1010
原创 [LeetCode] Implement strStr() [18]
字符串匹配这也是个老题了,方法主要有下面4种,1. 暴利破解法(BF),这个没啥说的,就是一轮一轮的比较,知道遇到相匹配的,这个的时间复杂度为O(n^2)。2. KMP,这应该是字符串匹配领域中最长听说的算法了吧。3. Horspool算法,这个不常听说,但是也是很有名的。4. Boyer-Moore,这个听说过的人应该也不会很多,这个算法在大量字符串的情况下,效率是最高的,能达到kmp的3到4倍。上面四种算法都很重要,一般标准库中的字符串匹配都使用的是暴力法。上面四种算法详细的见我下面的这几篇
2014-06-07 16:58:01 1062
原创 [LeetCode] Two Sum [17]
题目 :Input: numbers={2, 7, 11, 15}, target=9Output: index1=1, index2=2解题思路:给出一个数组合一个数,如果两个数的和等于所给的数,求出该两个数所在数组中的位置。这个题也挺常见的,就是两个指针,从前后两个方向扫描。但是本题有以下几个需要的点:1. 所给数组不是有序的;2. 返回的下标是从1开始的,并且是原来无序数组中的下标;3. 输入数组中可能含有重复的元素。好了,把以上三点想到的话,做这个题应该不会有啥问题。具体方法:把原
2014-06-07 16:18:24 1073
原创 [LeetCode] Median of Two Sorted Arrays [16]
求两个排序数组的中位数。这个题可以有以下几个思路:首先可以想到的是将两个数组merge起来,然后返回其中位数。第二个是,类似merge的思想加上计数,找到(m+n)/2个数或者其前后的数,这个就可以算出中位数。这个方法对于各种情况需要一一考虑到。第三个,假设A[k/2-1]<B[k/2-1],那么A[k/2-1]之前的数一定在整个有序数列中(m+n)/2之前。这里我给出后面两种思路的代码。代码一( 思路三)
2014-06-07 15:44:55 812
原创 [LeetCode] Longest Substring Without Repeating Characters [15]
题目:Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters for "abcabcbb" is "abc", which the length is 3. For "bbbbb" the longest substring is "b", with the length
2014-06-07 12:43:48 992
原创 [LeetCode] Longest Palindromic Substring [14]
最长回文字串,相信做过Palindrome Partitioning II 这个题的同学应该可以很快做出来。没错,这个题还可以使用动态规划方法得到一个时间复杂度为O(n^2)的解法,当然如果你想要更好的时间复杂度的算法也是有的。好的,我们先来看看时间复杂度为O(n^2)的算法。代码实现--动态规划O(n^2)相信如果你在网上看过了别人的算法,你会发现我的算法是最简洁的。哈哈,这个题需要注意的是如果你用惯了vector的话,你这里肯定会得到超时的提示......代码二--复杂度为O(n)的算法
2014-06-06 23:15:12 1053
原创 [LeetCode] Palindrome Number [13]
题目:Determine whether an integer is a palindrome. Do this without extra space.解题思路:判断一个int型整数是不是回文数字,这个题也不难,依次取得数字最高位和最低位进行比较,就可以判断是不是回文数字。需要注意的是负数不是回文数字。代码实现:
2014-06-06 19:40:52 867
原创 [LeetCode] Palindrome Partitioning II [12]
题目:For example, given s = "aab",Return 1 since the palindrome partitioning ["aa","b"] could be produced using 1 cut解题思路:给一个字符串,如果字符串可以划分成若干子回文字符串,返回最小的划分数量。这个题如果还用之前求所有划分组合的循环加递归方法的话,就会得到超时的错误。这是就要考虑别的方法,动态规划倒是一个不错的方法,但是动态规划最重要的是要找到动态方程。本题的动态方程:dp[i] =
2014-06-06 17:40:20 870
原创 [LeetCode] Palindrome Partition [11]
题目:Given a string s, partition s such that every substring of the partition is a palindrome. Return all possible palindrome partitioning of s.解题思路:回文划分,题目意思是给一个字符串,找出将字符串划分为一系列回文子串的各种可能组合。例如,一个子串“aab“,你需要返回["aa","b"],["a","a","b"]。这个题目的解法也是非常的典型---循环加递归,
2014-06-06 15:49:59 1541
原创 [LeetCode] Valid Palindrome [10]
题目:For example,"A man, a plan, a canal: Panama" is a palindrome. "race a car" is not a palindrome.解题思路:验证一个字符串是否是回文字符串。首先看看wiki上对于回文的解释:回文,亦称回环,是正读反读都能读通的句子,亦有将文字排列成圆圈者,Famous examples include "Amore, Roma", "A man, a plan, a canal: Panama" and "No 'x' in
2014-06-06 14:46:44 949
原创 [LeetCode] ZigZag Conversion [9]
题目:convert("PAYPALISHIRING", 3) should return "PAHNAPLSIIGYIR".解题思路:这个是个纯粹找规律的题,其他没啥特殊的。下面的例子nRows=4;找规律按照数组小标开始,寻找下标出现的规律,1. 第一行和最后一行相邻元素下标之差为 2*nRows-2;2. 除过第一行和最后一行,其余行要多一个元素,该元素出现的下标和行号有关,比如5 = 1 + 6 - 2,可以总结出规律为 j + 2*nRows-2 - 2*i;关于 i 和 j 看以看下面
2014-06-06 11:58:27 1154
原创 [LeetCode] Reverse Integer [8]
题目Reverse digits of an integer.Example1: x = 123, return 321Example2: x = -123, return -321。解题思路:颠倒一个整数中数字的位置,哈哈,类似翻转字符串一样,只不过整数需要计算,需要考虑溢出,其他无而。写出代码不难,只是溢出的时候怎么办,我这里是按照返回-1处理的,在leetcode上可以AC。代码实现:
2014-06-05 23:06:38 1011
原创 [LeetCode] String to Integer (atoi) [7]
这是个老题目了,主要考察的是能不能考虑到所有的情况,还有就是怎么判断是否溢出。情况大致分为如下四种:(下面我使用@代替空格,x代表除数字之外的所有字符)1. "@@[+-]3232343@@"2. "@@[+-]333x54"3. "@@[+-]4343"4. "2147483648"或者"-2147483649"(也就是溢出的情况)下面代码中给出了两个判断是否溢出的方法。
2014-06-05 20:49:01 1136
原创 搭建本地Jekyll环境
最近用github搭建了个博客,正好也学习一下markdown语法,由于markdown写完后不是立即可见,所以每次写完文章都要经过在线调试,而在线调试就得上线文章,每次上线都得重复git add, git commit, git push这三步。非常的繁琐。就想怎么样能够本地调试文章,就上网搜了下,发现可以安装jekyll本地环境,下面就来说说我的安装步骤,安装过程中也出现了不少问题,我的安装环
2014-06-04 14:11:06 3528 1
原创 [LeetCode] Regular Expression Matching [6]
设计一个支持‘.' 和 '*' 的正则表达式匹配算法。这个题复杂的地方在于对于 '*' 的处理,这个符号在正则表达式中被称为贪婪型的量词。这个量词在实际匹配过程中也是尽可能多的匹配直到词尾或者不匹配成功才结束,然后如果其后面还有没有匹配的,则回退到合适的位置,然后才进行下一个匹配。正则表达式中的匹配优先与回溯大概也就是这个意思。关于正则表达式这方面的知识,有兴趣可以读读《精通正则表达式》的第4章表达式的匹配原理。回到本题,正因为 '*'的特殊性,我们在分类的时候选择根据 '*' 来进行,分类后其子问题也
2014-06-04 12:09:54 1015
原创 [ LeetCode ] Longest Common Prefix [5]
题目Write a function to find the longest common prefix string amongst an array of strings.原题链接解题思想给一个字符串数组,求这些字符串的最长公共前缀。这个题应该是比较简单的,直接写代码,一次AC。解题思想是依次对数组中的字符串求最长公共前缀。代码实现class Sol
2014-06-04 10:59:01 972
原创 [ LeetCode ] Single Number II [4]
数组中含有n个数,其中一个数只出现1次,其余个数均出现3次,就只出现1次的数。首先应该想到的就是计数法,先对数组排序,然后统计每个数出现的次数,找出出现次数为1个数;更高级一点的方法还是用位运算,充分发掘数字二进制中的0和1出现的规律。一个数字是由0和1组成的,如果这个数字出现3次,那么这个数字中各个位上0和1出现的次数也应该是3次。按照这样统计数组中所有数的各个位1的个数,如果个数是1个倍数,这所求数字该位不为1。举例如下:数组: 1, 3, 1, 5, 1, 6, 5, 6, 6, 5对应的
2014-06-04 10:31:52 983
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人