- 博客(166)
- 收藏
- 关注
原创 leetcode第一刷_Word Ladder II
这道题很难。之前的题目我提到过一次用两个vector来做层序遍历的,就是因为这道题。要想最后恢复出单词变换的路径,就需要事先保存,根据dp中路径恢复的启发,保存的应该是一个单词的前一个变换节点。可能有很多个单词都能变换到当前单词,因此应该是一个set。用一个二维的vector保存当前可以变换到的单词和变换出这些单词单词。每一维的vector存放的都是一个set。设存放当前可访问单词的vecto
2014-05-15 12:14:50
1018
1
原创 leetcode第一刷_Median of Two Sorted Arrays
这道题是我最初刷的那20多道之一,但一直没有过,被各种各样的情况折磨死了,直到把所有其他的题都写完,回来看大神对这道题是怎么处理的时候,才惊叹算法的奇妙。再次验证了我的想法,如果要处理各种各样的特殊情况,一定是算法本身有问题。之前看过很多有关在两个排序数组中找中位数的解法,大多根据两个数组长度不同分了很多种情况,各种讨论。下面要介绍的方法并没有直接求中位数,而是把求中位数转换成了求两个数组合并
2014-05-15 10:34:51
715
原创 leetcode第一刷_Regular Expression Matching
这道题跟有?和*的那道题很像,不过要简单一些。为什么会简单呢,因为*号只能匹配跟它前面相同的字符。需要注意一点,从aab可以用c*a*b来匹配可以看出,*号可以使他之前的那个字符出现次数变成0。昨天实验室的同学正好在做这个题,说想用递归做,我想都没想就说用递归肯定超时了。她为什么,我跟人家说因为递归的分支太多了,可怎么也想不起当初自己是怎么写的,回来一看,居然用递归做的,打脸啊。。这个题为什么
2014-05-15 09:40:13
748
原创 leetcode第一刷_Integer to Roman
这道题当时不会写,是参照discuss写的。首先要弄明白罗马数字的规则,这个在国外难道是常识吗,为什么题干一点都没讲。。4000以下一共有下面几种符号:"M", "D", "C", "L", "X", "V", "I",对应到我们十进制为:1000, 500, 100, 50, 10, 5, 1。还有一条非常重要的规则,就是同样的字符最多重复出现三次。这就决定了数位上带4和9的跟普通的数值
2014-05-14 22:36:55
762
原创 leetcode第一刷_Longest Common Prefix
这个题貌似比想象中的要简单很多。完全用不上前缀树什么的高级的数据结构。话说室友经常跟我
2014-05-14 21:52:29
512
原创 leetcode第一刷_4Sum
用暴力水过了两个,正在沾沾自喜,当看到连续加的规模增加到4时,眼泪直接掉下来了,新想这下我这水货原形毕露了,没想到。。我抱着试试看的心态,又写了一种水水的暴力解,每次固定前面的两个节点,后面的两个按照twosum那套来搞,搞完了移动之前固定的右边的那个点,最后再移动固定的左边的那个点,居然也过了。。刚想起来其实twosum有一种很优雅的解法,建一个hash表,从头扫描数组,遇到一个数,查找
2014-05-14 21:48:12
706
原创 leetcode第一刷_3Sum
估计大家都会做twoSum,一头一尾两个指针,跟据和的大小移动就行了。3sum能不能用相同的方法呢,我尝试用暴力做,居然过了。思路是先把数组排个序,让相同数字的都靠在一起,然后固定一个数,其他两个数就按照twosum的那一套来,只不过计算sum的时候多算了一个数而已。需要注意一个问题,靠在一起一样的数,只能在第一次遇到它的时候用,更准确一点说,每个相同的数,只有一次作为i或j或k的机会,而且不
2014-05-14 21:28:25
653
原创 leetcode第一刷_Letter Combinations of a Phone Number
水题。数字一共就9个,去掉1是用来显示标点的,剩下8个。穷举一下map,然后有几个数字,就输出这几个数字的排列,是一个dfs嘛。map num;void allCombinations(string &digits, int start, int len, string &pres, vector &res){ if(len == digits.length()){
2014-05-14 21:12:05
646
原创 leetcode 第一刷_Remove Nth Node From End of List
链表问题里经典的双指针,一个先动,一个后动,然后同时动,无他,
2014-05-14 20:20:55
522
原创 leetcode第一刷_Generate Parentheses
这道题还挺好的,有一点意思。一共有两个候选的元素,每个候选元素最多可以用n次,他们两个之间还有个限制条件是要加入右括号必须要求未匹配的左括号数大于0才行。通过这些应该已经有思路了,递归的时候,每次都可以由两种选择,要么在下个位置上放左括号,要么放右括号,需要记录两个量,一个是一共放了多少个左括号了,另一个是当前未匹配的左括号有多少个。这样,当未匹配的左括号数大于0时,才可以继续放右括号,也就是
2014-05-14 19:50:05
649
原创 leetcode第一刷_Divide Two Integers
在剑指offer上有一道不用加减的加法,给了很多稀奇古怪的解法,今天想找来看看,找不到这本书了。。我不知道左移和右移算不算作弊了,因为本质上还是乘除了。不能用乘除,可以用加减。一个一个的加上去,看看能加多少个除数,果断超时了。计算机很神奇,最神奇的地方就是能把多复杂的事情,都转化成01两种操作,二分,二倍,像算法里的01,是很多算法的基础。当一个个加不行的时候,想想每次double嘛,不仅do
2014-05-14 19:13:14
643
原创 leetcode第一刷_Substring with Concatenation of All Words
这道题我并没有想到太好的解法,用了两个map,时间效率很差,勉强过了。要求一个字串,是字典里所有单词的一个种组合。显然不能先求出所有组合,再看是不是字串,这时间复杂度太高。还好题目中说明了所有单词的长度是一样的,这大大简化了操作。我的做法是建立一个map,这个map以单词为键,以出现次数为值,哈哈,没想到吧~这里很容易忽视的一个问题是同一个单词可能在字典里存了多次。然后开始扫字符串,每次取单词
2014-05-14 18:49:23
730
原创 leetcode第一刷_Next Permutation
这个题想了好久没想出来,后来查了一下,原来是STL里的一个函数,直接给前辈跪了。要想在O(N)的时间内求得,必须找到当前排列与后一个排列之间的关系。举几个例子,13245的下一个排列是13254,15432的下一个排列是21345,有没有什么联系呢?我觉得不说出来的话是很难发现的。后一个排列一定是由前一个排列置换得到的,最简单的情况,12345,下一个排列是12354,置换的一定是原来是顺序的
2014-05-14 18:29:38
690
原创 leetcode第一刷_Longest Valid Parentheses
括号的问题在编译原理里用到的很多,做法大半需要用栈。这个问题有点不一样的地方是,输入很可能不合理,也就是括号很可能不匹配,这怎么搞?我的做法是用一个数组来做标记,依然是左括号入栈(入栈的是他的位置),右括号出栈,当一对括号成功匹配的时候,把标记数组中他们相对应的位置标记为1。这样过一遍之后,扫描一下整个标记数组,有多少个连续的1,就是有多少个连续的匹配,输出一下个数就行了。class So
2014-05-14 18:06:05
599
原创 leetcode第一刷_Search for a Range
实际上也是一个二分查找的问题。要找出范围,决定了当找到这个数时不能马上返回,如果找target最前面的那个位置,只有当这个位置等于target,且这个位置的前一个位置不等于target时,才能返回这个位置。如果找的是target最后面的那个位置,那么只有当这个位置等于target,且这个位置的后一个位置不等于target时,才会返回它。不满足返回条件时,下一次递归走什么位置也不一样,找前面的时
2014-05-14 17:12:25
597
原创 leetcode第一刷_Sudoku Solver
这道题简直是耻辱啊,居然被吓得不敢做,终于开始写还犯下了各种低级错误,花了好久的时间。其实如果想明白81*9其实是很小的规模的话,早就想到用回溯法了,这不是跟八皇后完全一样的嘛。每次填入的时候,验证一下合不合理,其中合不合理在上一个问题中已经讨论过了,对当前位置讨论更简单。所的头头是道,你会问“那你是错在哪呢?”你猜啊。我在判断一个小方格时候合理时,走了很多弯路。一开始想的是用循环和减法,
2014-05-13 22:45:11
745
原创 leetcode第一刷_Valid Sudoku
一开始没看清题,以为让当场求数独呢,吓得一直没敢做。后来发现这个题原来如此之简单,只要判断现在棋盘上的数字满不满足情况要求就可以了。这不就是三次循环吗。。看看每一行满不满足,每一列满不满足,每个小的3*3的格子满不满足就行了。每个小3*3格子我是用求得左上角的方法来验证的。其实觉得数独难还有一个原因是记得他在编程之美上出现过。。那上面讨论的主要是怎样构造一个数独,具体记不太清楚了,印象最深
2014-05-13 22:34:12
679
原创 leetcode第一刷_Count and Say
水题。描述的还挺麻烦的,实际上就是纸老虎,用两个string,一个存上一轮的结果,一个用来更新出这一轮的结果,每次扫描上一轮,统计一个字符出现的次数,然后把这个次数和字符加入到这一轮的字符串中就可以了。class Solution {public: string countAndSay(int n) { if(n == 0) return "";
2014-05-13 22:27:20
801
原创 leetcode第一刷_Combination Sum Combination Sum II
啊啊啊啊,好怀念这种用递归保存路径然后打印出来的题目啊,好久没遇到了。分了两种,一种是可以重复使用数组中数字的,一种是每个数字只能用一次的。其实没有多大区别,第一种每次进入递归的时候都要从头开始尝试,第二种要找一个标记的数组,把已经用到过的排除掉,就像生成全排列时的做法一样。跟我一样用引用保存中间结果的话,要注意回退的情况。第二种回退时,要把用到的那个数也恢复为可用,就完全像全排列时做的一样。
2014-05-13 22:23:11
800
原创 leetcode第一刷_ First Missing Positive
未排序数组,O(N)时间,常数空间,这道题让我非常清晰的感觉到算法的魅力。先想一下如果允许用额外空间的话,我们会怎么做,对,我们会建立一个hash表,然后从头到尾的扫描数组,等等,怎么映射呢?有n个数,要找第一个消失的正正整数,那么这个消失的正整数的取值范围是什么呢?[1, n+1],之所以包含n+1是因为如果这n数正好是连续的前n个自然数。那我们就知道了,开一个长为n的哈希表,如果当前扫到得
2014-05-13 22:13:49
668
原创 leetcode第一刷_Trapping Rain Water
很有意思的题目,我一开始的思路受计算柱状型最大面积那道题的影响,想每次求两种满足特定关系的柱子之间的水的量,结果各种错,各种特殊情况需要排除,我意识到是自己的思路有问题了。停下来想一下水的体积到底跟什么有关系?当然可以把是水的地方都加起来,这样必须看两个柱子之间的高低关系,还要考虑底部的高度。还有一种方法呢,求整个区域的面积,然后把不是水的地方去掉,剩下的就是水的体积。这种方法好在那里呢?这种
2014-05-13 21:39:25
649
原创 leetcode第一刷_Multiply Strings
前面提到过很多次大整数的问题,这个是真正的大整数。我用了一个很蠢得方法,先写一个大整数和一个个位数相乘的方法,返回的结果是一个string,然后写一个string相加的方法,每次循环,用其中一个数的每一位去乘另一个数,然后加到结果上。。多么愚蠢的思路,居然还一遍过了。。一个更好的方法是先用两个int数组把两个string存一下,每位占数组中的一个数,然后再用一个int数组保存结果,每次也是
2014-05-13 21:13:09
654
原创 leetcode第一刷_Wildcard Matching
又好又难的题。我发现难题一般都包含了好几个简单题,必须对一些基本的算法熟练掌握才能快速准确的写出代码。这个题就用到了kmp,这个算法写过好多遍,还是不断的出错,哎。题目中有两种符号,?可以匹配任意单个字符,*可以匹配任意0个或多个字符。?其实没什么,麻烦就麻烦在*上。一个*实际上代表了一段任意的字符串。很容易想到的一种解法是用递归,当p[i]不为*时,看p[i]是不是'?'或者p[i]==
2014-05-13 21:00:01
796
原创 leetcode第一刷_Jump Game II
要求最小的步数,是不是很容易想到用dp啊?我一开始的做法是,当找到了一个可以从它延伸到更远的位置,就把这个位置和最远位置的步数都更新一下,结果超时了。其实这样不仅是超时的,而且是错误的。因为这段距离里的很多点,其实是上一步就能到达的。其实应该更新的只有哪些新的能够到达的点,那哪些点是新的能到达的点呢?假设这次能够延伸更远的点是i,它的前进步数是A[i],上一次能够到达的最远的点是mmax,那新
2014-05-13 15:07:29
1411
原创 leetcode第一刷_Permutations II
当有重复元素的时候呢?不用拍脑袋都会想到一种方法,也是所有有重复元素时的通用处理方法,维护一个set,如果这个元素没加入过就加入,加入过了的忽略掉。但是,在这道题上这个通用方法居然超时了!怎么办?想一下为什么会这样,假设我们要排列的数字是1111112,当当前的排列中没有1时,取哪个1生成一遍,都是一样的。只有当前面的1都用过了,必须轮到这个1出场的时候,它才会有价值。更明确一点说,假设我
2014-05-13 14:53:25
1486
原创 leetcode第一刷_Permutations
生成全排列的经典问题,递归方法的典范。bool visited[10000];void getPermutation(vector &num, vector > &res, vector &pres, int len, int p){ if(p == len){ res.push_back(pres); return; } for(i
2014-05-13 14:41:53
1178
原创 leetcode第一刷_Rotate Image
这个题该怎么说呢,旋转又要求inplace,一般就是要找到某种规律了,这个还是很明显的,画一下原来的,再画一下旋转之后的,看看原来的跑到什么位置了。牵扯到四个位置按顺时针方向互换一下位置,发现只要做三次交换就可以实现,好神奇。最后需要注意调整到什么时候结束,如果n是偶数的话,到n/2就是最里层了,不需要继续旋转。奇数其实也是,正好少了最里面的那个只有一个数的层。class Soluti
2014-05-13 14:39:20
1344
原创 leetcode第一刷_Anagrams
今天再看这个题时,死活想不起这个单词是什么意思,查了字典都不知道,真晕了。这个单词直译是颠倒顺序所形成的单词,实际上就是从集合中找出所有是由一组字母形成的那些单词,这种可以由很多组,即只要这组字母形成的字典中的单词多于1个,就要把这些单词输出出来。怎么做呢?思路还是很简单的,要找出是由一组字母形成的单词,显然应该知道每一个单词是由哪些字母形成的,这当然可以建一个hash表,每次都比对has
2014-05-13 13:56:22
1427
原创 leetcode第一刷_Pow(x, n)
快速乘方的算法,写了好多变,出了各种错,真是服了我自己了。思想是每次对n减半,将当前的temp平方。需要注意的是如果当前的n是个奇数,减半之后会丢失掉一次乘积,因此如果当前的n为奇数,应该先在结果里面乘一个temp。还有,n可能是负数,负数的次方最后要求一次倒数。class Solution {public: double pow(double x, int n) {
2014-05-13 13:03:28
1450
原创 leetcode第一刷_N-Queens
八皇后问题应该是回溯法的教学典范。在本科的时候,有一门课叫面向对象,最后的附录有这个问题的源代码,当时根本不懂编程,照抄下来,运行一下出了结果都很开心,哎。皇后们的限制条件是不能同行同列,也不能同对角线。那么显然每一列上都要有一个皇后,只需要用一个一维数组记录皇后在每一行上的位置就可以了。算法的思想是:从第一行开始,尝试把皇后放到某一列上,可以用一个vis数组保存已经有皇后的列,当找到一个还没
2014-05-13 12:29:04
1766
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人