leetcode
文章平均质量分 66
术学家
这个作者很懒,什么都没留下…
展开
-
Largest Rectangle in Histogram
这道题的启示:(1)不要通过改bug来原创 2014-11-15 21:24:27 · 267 阅读 · 0 评论 -
Search in Rotated Sorted Array II
这道题目类型不少,一般情况下是能写出来的。但写的复杂,时间长。切入点要放在中间元素和端点元素的比较上,并依此进行情况的分类。传统的二分主要是比较中间元素,然后决定前进的方向。这里相当于多了一层判断。1.先判断已排序的部分,2,在确定前进的方向,3,所谓前进就是left和right的值的更新。最坏的情况下对退化为线性。简洁的代码:https://oj.leetcode.com/d原创 2014-12-20 17:46:30 · 278 阅读 · 0 评论 -
Combination Sum 2 不允许重复
虽然号称为combination sum的follow up,我觉得不如原题有难度。不重复是比较自然的。下次遍历是从当前元素的下一个开始就可以了。这道题仍然存在重复序列的问题,也就是符合条件的相同序列存在多个,如何去重呢?一种办法是保存所有符合条件的序列,最后对总结果进行sort , unique ,resize,这样做代价还是比较大的。另一种做法是防患于未然,提前把可能存在的重复干掉。因为已原创 2014-12-21 19:26:30 · 408 阅读 · 0 评论 -
Spiral Matrix所谓的顺时针打印矩阵
很久之前我面试曾遇到过这道题目,现场写的非常混乱。这道题目应该算是难题,难在对边界条件的处理。如何发现规律,发现不变式,并能保证简单性是关键。一个明显的不变式是(→ ↓ ← ↑ )如何让它顺畅的循环?我们可以用两个变量来限制循环,一个循环中两个行是存在关系的:rowBeg+rowEnd =row 以及 *Beg 也可以用*Beg来表达*End,但会发现用四个变量来表示程序会变得更加简单。这原创 2014-12-22 09:41:55 · 440 阅读 · 0 评论 -
保存一棵树根到叶子之和为给定值的所有路径的BFS解法
BFS是较为直观的解法。缺点是要借用不少数据结构的帮忙,也许可以想办法避免。在需要树的路径时,往往会重新搞一个数据结构,保存子->父的回溯链,这个容易实现。但确实浪费了时间和空间,避免方法之一是冗余存储。每个节点中按顺序存储所有祖先节点信息。如此, 当该节点被选中时,它的祖先自然也就确定了。本题的数字可以用一分隔符,例如“#”分割,以完成最后的答案的构造。/** * Defini原创 2014-12-09 19:39:32 · 1067 阅读 · 0 评论 -
合并两个有序列表
题目本身很简单,但是有一个地方值得一记。直觉性错误:假设两个列表的长度都是从0算起,一个长为m,一个长为n,则两者长度之和是多少?直觉告诉你是m+n,但事实它是m+n+1。void merge(int A[], int m, int B[], int n) { if(m==0) while(n) {A[n-1]=B[n-1];n--;}原创 2014-12-08 18:52:52 · 673 阅读 · 0 评论 -
求两个用链表表示的数字和
例如:Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)Output: 7 -> 0 -> 8凡是链表的题目思路一定要缜密。犯了三个错误。ListNode *addTwoNumbers(ListNode *l1, ListNode *l2) { if(!l1) return l2; if(!l2) return l1;原创 2014-12-09 14:43:20 · 483 阅读 · 0 评论 -
保存一棵树根到叶子之和为给定值的所有路径的DFS解法
这道题目DFS用得非常不自信。(1)递归的用得不够大胆,过分考虑细节了,应该站得高些。(2)思路厘清之后,要注意状态值的修改,就是状态恢复。深度优先走到底之后,需要返回,此时对应的状态也应该返回。例如之前放到堆栈/vector里的状态数据要弹出来。/** * Definition for binary tree * struct TreeNode { * int val;原创 2014-12-09 16:05:53 · 786 阅读 · 0 评论 -
中序和后序构建二叉树
这题和上题几乎一样,但却出了个RE的错误。原因是,再求下标范围的时候偷懒,导致了越界。悔不当初!稍有疏忽,代价很大。in1=i1; in2=mid-1; inL=mid+1; inR=i2; //split inorder into two subtree :left & rightpt1=p1; pt2=in2; ptL=pt2+1; ptR=p2-1;偷懒直接把pt2=in2了,这两原创 2014-12-11 13:37:06 · 407 阅读 · 0 评论 -
统计一个字符串的最后单词的长度
这道题目被归为简单题目,对我来讲,却不觉得简单。有些题目是算法题,有些题目是细节题。算法往往难想,细节往往难以实现。两者无论哪个存在难度,都不能算是简单题。这道题目难度在于,直观上要分很多种情况讨论,而实际上可以做简单归纳,是难度大大降低。而归纳、提炼能力又有几个人能做好呢?所以此题很难。不同的case:(1) ""(2) "a"(3) " "(4) "a原创 2014-12-10 12:08:05 · 663 阅读 · 0 评论 -
N-Queens
这是经典的题目,但是写的很痛苦。大致思路是容易得到的,难在细节以及把递归思路想清楚。教训:(1)在要求所有解的DFS中,不要在得到一个解时把中间状态清0,不要受回溯思想的影响;这里的memo不用恢复的原因是下次计算自然就把当前的memo覆盖了,当然你去恢复也没有错。(2)一路改BUG写完的程序,不是真正的写完,说明你没有真正想清楚,下次再写还会犯同样的错误。与其下次再犯,不如这次仔细反原创 2015-01-16 16:25:49 · 315 阅读 · 0 评论 -
前序和中序构造树的递归实现
虽然有时候递归的效率不高,但可以化繁为简使做题的效率大大提高。是程序设计重要的一术要熟练掌握 。就本题来说,最重要的的包括三个方面:(1)如何设计递归体(2)递归参数如何传递(3)递归出口怎眼写才能使程序简化 首先,递归体的形式决定了能否较为简单的完成程序,如果细节考虑得过于繁琐,则即使用了递归程序也会写的很痛苦。因为你把本来该电脑自动完成的任务过多得交给了自己。所以,原创 2014-12-11 09:34:37 · 489 阅读 · 0 评论 -
Best Time to Buy and Sell Stock III(最多出手两次的多大获利)
出现的bugs:(1)由两个if的来计算序列的值,讨论了>和(2)引用初始化。在两个函数里的两个参数引用初始化了同一个vector,结果是第二个引用参数由于iterator的更改而全部失效,也就是说所有的结果都恢复到了初始化的状态。思维的卡壳:(1)计算逆序的最大值时出错class Solution {public: vector maxlr(vector &pri原创 2014-12-13 16:14:29 · 545 阅读 · 0 评论 -
Longest Consecutive Sequence 递归实现
这道题目也写得非常痛苦,还是在借鉴别人的思路下完成,极其不爽。完全不在状态。犯了两个比较蛋疼的错误(1)递归依然没想清楚,把core写在了后面,导致了重复计算;(2)对状态值的更新有误,应该更新序列两端的值而不是中间的!另外实现整体看起来非常的丑有经验的人都说想清楚了在动笔错误就会少,我想说TMD,如果想不清楚呢?就永远不动手写?没有人能做到真正的想清楚,除非那个问题很简单。我原创 2015-01-17 21:35:57 · 357 阅读 · 0 评论 -
Longest Consecutive Sequence 非递归实现
这道题非递归更直观,递归的写法纯粹是为了训练递归意识。璀璨。非递归除了代码简短,也没啥别的优势。 int longestConsecutive(vector &num) { if(num.size()==0) return 0; int left,right,maxv=1; unordered_map memo; f原创 2015-01-17 22:07:19 · 341 阅读 · 0 评论 -
edit distance
空间复杂度为O(m*n)的解法是容易的。如果把空间复杂度降下来,需要对状态数组有深刻理解,一个网址讲得不错:http://www.cnblogs.com/chasuner/p/editdist.html附录一个普通的非递归解吧int editDistance(string s1, string s2){ int m = s1.size(), n = s2.size(); if (!m原创 2015-01-18 17:56:14 · 308 阅读 · 0 评论 -
Single Number II
这道题目有很多O(n)解法。(1)可以用unordered_map。但这个很难说是O(n),哈希冲突是难以预测的,理论上可以算O(n).class Solution {public: int singleNumber(int A[], int n) { if(n<=0) return -1; unordered_map mp; fo原创 2014-12-14 11:39:22 · 298 阅读 · 0 评论 -
Single Number II位运算解析
本题最机巧的O(n)解法最早由1337c0d3r于2013.11.26发布在leetcode。之后看到类似的,都系转载、引用或抄袭。(原文:https://oj.leetcode.com/discuss/857/constant-space-solution)大多数转载都写得语焉不详,有的甚至据为己有。本帖旨在全面解析该算法。如下:int singleNumber(int A[], i原创 2014-12-14 13:01:40 · 748 阅读 · 0 评论 -
Copy List with Random Pointer复制带有随机指针的链表
这道题目很经典,很多书和OJ里都有。如果初次遇到,一定很难搞定。再看其解法,实在是很惊艳。有两个可以得到深刻启示的地方:(1)冗余的思想。谈到复制,我们往往都会另起炉灶,而不会原来链表上搞来搞去,感觉很复杂很危险,会一团糟。美错,最危险的地方就是最安全的地方。(2)指针的步伐。这里的指针有一走两步的操作,很容易导致RE。但是否意味着每步都要仔细考虑指针越界?不然,那样程序会写的很累很乱原创 2014-12-05 11:06:29 · 952 阅读 · 0 评论 -
Combination Sum求和为给定值的所有序列的解题思路
因为数字可以重复,毫无疑问,这道题要用回溯来解。写出代码不难如下:class Solution {public: vector > rec_combinationSum(vector &candidates, int target) { vector> res; if(target==0){ res.push_back(vector(原创 2014-12-21 16:06:27 · 351 阅读 · 0 评论 -
Combination Sum求和为给定值的所有序列的解题思路(续)
如前,浪费时间的地方在于对所得结果的排序。而这个排序可以通过改写在递归过程中实现,从而省去以减少运行时间。为此,要增加一些参数:class Solution {public: void rec_combinationSum(vector> &res,vector &candidates, int target,int idx,vector &tmp) {原创 2014-12-21 17:00:53 · 255 阅读 · 0 评论 -
Maximal Rectangle
这个东西让我很郁闷。int largestRectangleArea(vector &height) { stack stk;//cout<<height[stk.top()]<<" test"; height.push_back(0); int maxv,area,first; maxv=0; if(heigh原创 2014-11-16 18:52:30 · 299 阅读 · 0 评论 -
编辑距离
状态转移方程还是比较难推出,这是DP问题的原创 2014-11-21 22:57:09 · 256 阅读 · 0 评论 -
删掉倒数第N个节点
注意要分两类情况处理。虽然显得复杂原创 2014-11-23 18:15:10 · 334 阅读 · 0 评论 -
编辑距离的非递归解法
和递归解法相比,主要难点在于原创 2014-11-23 18:07:20 · 421 阅读 · 0 评论 -
合并两个有序链表
链表的题目总是让我很惆怅。动辄就会runtime error.原创 2014-11-24 15:47:46 · 577 阅读 · 0 评论 -
链表逆转以及删除所有重复元素
1,没有多余的头结点;2,原创 2014-11-24 11:46:22 · 236 阅读 · 0 评论 -
Anagrams
这道题目还是比较让人意外的。首先,anagram,我的理解god和原创 2014-11-24 20:46:44 · 369 阅读 · 0 评论 -
最长无重复子串的简单实现
最简单实现的必须要搞定,之后再说更高级的办法。程序如果总是bug,不是你的问题,你只是需要一个break,否则就会一直呆在bug的死循环中。解决问题最好的办法一定不是死磕到底,而是要学会放一放但不要放到遗忘,而要等待时机卷土重来。int lengthOfLongestSubstring(string s) { if(s=="") return 0; in原创 2014-12-01 17:57:23 · 296 阅读 · 0 评论 -
Find Minimum in Rotated Sorted Array II
这道题目几乎没有什么好的解法。而leetcode的统计显示有接近0秒的解法,我不得而知。我试了最基本的O(N)解法,与写得较好的二分法,在leetcode上甚至O(n)的解法更快。AC不是唯一目的,这道题如果在面试中考察的应该是如何解决因重复而导致的退化问题。其实要把问题想的简单一些,当发现首尾元素相同而无法二分时简单的采用线性办法就好了。分享一个我觉得写得简单而优美的二分法(ht原创 2014-12-16 20:06:50 · 286 阅读 · 0 评论 -
四数之和为target特定值的序列
(1)算法思路是简单的。先求出所有的原创 2014-11-19 21:03:57 · 435 阅读 · 0 评论 -
InorderTraversal非递归实现
处理右子树的方法是关键。class Solution {public: vector inorderTraversal(TreeNode *root) { stack stack; vector res; if(root==NULL) return res; TreeNode * tmp = root;原创 2014-11-17 13:52:34 · 540 阅读 · 0 评论 -
最长无重复子串的DP实现
这道题能算DP吗?那要看是否具备最优子结构。我的分析是没有明显的子结构性质。例如当求下表为 i 的最长无重复子串时,要考虑两类情况。(1) s[ i ] 是否在字符串s之前的位置出现过,如果没有则长度 len++ ;(2) 如果出现过,分两种情况讨论(是否出出现在当前处理的子串中)(len表示当前处理的子串的长度)a> 在。那好办,直接更新len = i - (出现位置下标) ;原创 2014-12-02 10:17:08 · 737 阅读 · 0 评论 -
3sum 三数之和为0的简单实现
思路简单:(1) 三重 for ,符合a+b+c=0的 a,b,c保存在tuple里(2)tuple保存在set 中,一可去重,二可保持字典序(3)简单代价就是复杂度很高,O(n^3*logn) typedef tuple triplet;triplet sort3(int a,int b,int c){ if(a<=b){ if(b>c){ swap(b,c);原创 2014-12-02 14:11:00 · 479 阅读 · 0 评论 -
三数之和为0的三指针实现
for从来没有像这样用得如此混乱。当循环变量在循环中要改变时,最好用while。vector的clear()不仅会把值清掉,还会把内存清掉。务必注意。FOR版本:vector > threeSum(vector &num) { int sz= num.size(); vector triplet(3); vector >res; if(sz<3)原创 2014-12-04 15:23:07 · 361 阅读 · 0 评论 -
word ladder 2 的复杂实现
采用分治法的思想。(1)把所有两数之和计算出来,并保存在multimap中。放在unordered_multimap中的效率更高,但是因为其采用hash定位元素的方法,导致map中的数据不能按序索引。故要放弃unordered,虽然在有的版本中unordered的某些类型可以保持一定顺序,但本质是无序的。(2)对关联容器进行删除操作后,迭代器就会失效。这个一定要注意。例如:auto p =原创 2014-12-04 12:35:50 · 393 阅读 · 0 评论 -
subsets之给定一个数列&生成该数列所有的子集&升序
(1)先假设数列的元素不重复,例如[ 4, 2 ,3 ],可知总共有2^3=8个子集,在加一个空集;(2)对数列排序,可方便生成子集升序[2, 3 , 4];(3)每个子集对应一个二进制值,0-空集 1-> (2) 2->(3) 3->(2,3) …… 7->(2,3,4),二进制数1的位置对应数列中相应位置的数。遍历一遍可得结果。(4)进一步,如果数列有重复怎么办?例如[ 2 , 3原创 2014-12-04 17:55:06 · 778 阅读 · 0 评论 -
3Sum Closest从数列中找到三个数之和最接近给定值
即求min{ target - a -b -c } a,b,c blog to Set S;(一)最简单的做法当然是求出所有的不相同的三个数和,保存到set里,然后用target,target (+/-) i ,i [0....]复杂度基本上可以算是O(n^3)。int threeSumClosest(vector &num, int target) { int n=num.原创 2014-12-04 21:21:24 · 858 阅读 · 0 评论 -
Triangle三角形的最小路径和
最原始的方法,简单明了,但是会导致TLE。class Solution {public: int minimum(vector> &tri,int i,int j){ if(i==tri.size()-1) return tri[i][j]; return tri[i][j]+min(minimum(tri,i+1,j),minimum(tri,i+1原创 2014-12-14 15:42:35 · 465 阅读 · 0 评论