自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(59)
  • 收藏
  • 关注

原创 学习fibnacci堆的意义是什么

学习平摊分析(amortize analysis)的思想。 fib堆是一个非常复杂的数据结构,实际应用中没有应该没有普通的二叉小根堆更实用。但是里面涉及到了算法设计中一个重要的思想,平摊分析,这是一种洞察力。可以辅助设计整体性能更好的算法。删除最小的根,这个操作的复杂度是O(logn), 虽然和普通堆是一样的,但是这里做了很多工作。例如调整堆的高度,让有相同children的树合并在一起。这样做得

2017-03-19 06:14:07 517

原创 Amortize analysis

The accounting method overcharges some operations early in the sequence. Later in the sequence, the credit pays for operations that are charged less than they actually cost.The potential method, which

2017-03-18 07:32:00 542

原创 智能图书画像系统

可以改变未来人们的学习习惯,将会一个伟大的应用。我们拭目以待。

2017-03-18 06:36:40 827

原创 技术的未来

技术没有未来。

2017-03-18 06:34:51 375

原创 一 搜索引擎初步

调研开源工具目前知道的可能有用到的有:solr nutch lucene系统以及开发工具系统不用说就用Linux了 开发工具比较灵活:语言:java/cpp/python为主 计算:hadoop系列开始的时候多动手

2015-11-14 00:17:41 363

原创 欢迎使用CSDN-markdown编辑器

构建搜索引擎目标:先搭建一个极简的搜索,再迭代优化,最后达到商业标准。Markdown和扩展Markdown简洁的语法代码块高亮图片链接和图片上传LaTex数学公式UML序列图和流程图离线写博客导入导出Markdown文件丰富的快捷键快捷键加粗 Ctrl + B 斜体 Ctrl + I 引用 Ctrl + Q插入链接 Ctrl + L插入代码

2015-11-14 00:07:04 294

原创 看毛片(KMP)算法简析

看毛片算法又称KMP算法。该算法之所以得名无外乎如下原因。每当涉及该算法都甚新鲜,极想把玩一番,经过一番琢磨,终于悟透其本质。遂将其束之高阁,数月之后,再相邂逅,新鲜如初,又是一番把玩、醒悟、遗忘,如此循环以至无穷。足见,该算法与看毛片的道理一脉相承。初看新鲜刺激,观摩研究,醒悟不过如此而已。遂撇下而顾其它,数月之后,复习之,依然新鲜激动如故。以致数年。KMP算法核心在于求匹配失败

2015-01-18 23:46:07 40068

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

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

原创 Longest Consecutive Sequence 递归实现

这道题目也写得非常痛苦,还是在借鉴别人的思路下完成,极其不爽。完全不在状态。犯了两个比较蛋疼的错误(1)递归依然没想清楚,把core写在了后面,导致了重复计算;(2)对状态值的更新有误,应该更新序列两端的值而不是中间的!另外实现整体看起来非常的丑有经验的人都说想清楚了在动笔错误就会少,我想说TMD,如果想不清楚呢?就永远不动手写?没有人能做到真正的想清楚,除非那个问题很简单。我

2015-01-17 21:35:57 364

原创 N-Queens

这是经典的题目,但是写的很痛苦。大致思路是容易得到的,难在细节以及把递归思路想清楚。教训:(1)在要求所有解的DFS中,不要在得到一个解时把中间状态清0,不要受回溯思想的影响;这里的memo不用恢复的原因是下次计算自然就把当前的memo覆盖了,当然你去恢复也没有错。(2)一路改BUG写完的程序,不是真正的写完,说明你没有真正想清楚,下次再写还会犯同样的错误。与其下次再犯,不如这次仔细反

2015-01-16 16:25:49 326

原创 Spiral Matrix所谓的顺时针打印矩阵

很久之前我面试曾遇到过这道题目,现场写的非常混乱。这道题目应该算是难题,难在对边界条件的处理。如何发现规律,发现不变式,并能保证简单性是关键。一个明显的不变式是(→ ↓ ← ↑ )如何让它顺畅的循环?我们可以用两个变量来限制循环,一个循环中两个行是存在关系的:rowBeg+rowEnd =row 以及 *Beg 也可以用*Beg来表达*End,但会发现用四个变量来表示程序会变得更加简单。这

2014-12-22 09:41:55 447

原创 Combination Sum 2 不允许重复

虽然号称为combination sum的follow up,我觉得不如原题有难度。不重复是比较自然的。下次遍历是从当前元素的下一个开始就可以了。这道题仍然存在重复序列的问题,也就是符合条件的相同序列存在多个,如何去重呢?一种办法是保存所有符合条件的序列,最后对总结果进行sort , unique ,resize,这样做代价还是比较大的。另一种做法是防患于未然,提前把可能存在的重复干掉。因为已

2014-12-21 19:26:30 416

原创 Combination Sum求和为给定值的所有序列的解题思路(续)

如前,浪费时间的地方在于对所得结果的排序。而这个排序可以通过改写在递归过程中实现,从而省去以减少运行时间。为此,要增加一些参数:class Solution {public: void rec_combinationSum(vector> &res,vector &candidates, int target,int idx,vector &tmp) {

2014-12-21 17:00:53 266

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

原创 Search in Rotated Sorted Array II

这道题目类型不少,一般情况下是能写出来的。但写的复杂,时间长。切入点要放在中间元素和端点元素的比较上,并依此进行情况的分类。传统的二分主要是比较中间元素,然后决定前进的方向。这里相当于多了一层判断。1.先判断已排序的部分,2,在确定前进的方向,3,所谓前进就是left和right的值的更新。最坏的情况下对退化为线性。简洁的代码:https://oj.leetcode.com/d

2014-12-20 17:46:30 288

原创 Find Minimum in Rotated Sorted Array II

这道题目几乎没有什么好的解法。而leetcode的统计显示有接近0秒的解法,我不得而知。我试了最基本的O(N)解法,与写得较好的二分法,在leetcode上甚至O(n)的解法更快。AC不是唯一目的,这道题如果在面试中考察的应该是如何解决因重复而导致的退化问题。其实要把问题想的简单一些,当发现首尾元素相同而无法二分时简单的采用线性办法就好了。分享一个我觉得写得简单而优美的二分法(ht

2014-12-16 20:06:50 298

原创 如何传递二维数组

There are three ways to pass a 2D array to a function:1, The parameter is a 2D arrayint array[10][10];void passFunc(int a[][10]){ // ...}passFunc(array);2, The parameter is an array cont

2014-12-14 16:13:26 523

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

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

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

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

原创 中序和后序构建二叉树

这题和上题几乎一样,但却出了个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 449

原创 前序和中序构造树的递归实现

虽然有时候递归的效率不高,但可以化繁为简使做题的效率大大提高。是程序设计重要的一术要熟练掌握 。就本题来说,最重要的的包括三个方面:(1)如何设计递归体(2)递归参数如何传递(3)递归出口怎眼写才能使程序简化 首先,递归体的形式决定了能否较为简单的完成程序,如果细节考虑得过于繁琐,则即使用了递归程序也会写的很痛苦。因为你把本来该电脑自动完成的任务过多得交给了自己。所以,

2014-12-11 09:34:37 499

原创 前序和中序构造树的设计分析

题目分析:--------------------------------------------preOrderroot - left - rightinOrder left - root - right1, pre 的第一个把inorder划分成两个序列 inLeft , inRight2, 用inorder的两个部分去划分pre的,再等到pre的两

2014-12-10 20:42:14 299

原创 统计一个字符串的最后单词的长度

这道题目被归为简单题目,对我来讲,却不觉得简单。有些题目是算法题,有些题目是细节题。算法往往难想,细节往往难以实现。两者无论哪个存在难度,都不能算是简单题。这道题目难度在于,直观上要分很多种情况讨论,而实际上可以做简单归纳,是难度大大降低。而归纳、提炼能力又有几个人能做好呢?所以此题很难。不同的case:(1) ""(2) "a"(3) "       "(4) "a  

2014-12-10 12:08:05 673

原创 保存一棵树根到叶子之和为给定值的所有路径的BFS解法

BFS是较为直观的解法。缺点是要借用不少数据结构的帮忙,也许可以想办法避免。在需要树的路径时,往往会重新搞一个数据结构,保存子->父的回溯链,这个容易实现。但确实浪费了时间和空间,避免方法之一是冗余存储。每个节点中按顺序存储所有祖先节点信息。如此, 当该节点被选中时,它的祖先自然也就确定了。本题的数字可以用一分隔符,例如“#”分割,以完成最后的答案的构造。/** * Defini

2014-12-09 19:39:32 1079

原创 保存一棵树根到叶子之和为给定值的所有路径的DFS解法

这道题目DFS用得非常不自信。(1)递归的用得不够大胆,过分考虑细节了,应该站得高些。(2)思路厘清之后,要注意状态值的修改,就是状态恢复。深度优先走到底之后,需要返回,此时对应的状态也应该返回。例如之前放到堆栈/vector里的状态数据要弹出来。/** * Definition for binary tree * struct TreeNode { * int val;

2014-12-09 16:05:53 792

原创 求两个用链表表示的数字和

例如: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 493

原创 合并两个有序列表

题目本身很简单,但是有一个地方值得一记。直觉性错误:假设两个列表的长度都是从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 691

原创 Copy List with Random Pointer复制带有随机指针的链表

这道题目很经典,很多书和OJ里都有。如果初次遇到,一定很难搞定。再看其解法,实在是很惊艳。有两个可以得到深刻启示的地方:(1)冗余的思想。谈到复制,我们往往都会另起炉灶,而不会原来链表上搞来搞去,感觉很复杂很危险,会一团糟。美错,最危险的地方就是最安全的地方。(2)指针的步伐。这里的指针有一走两步的操作,很容易导致RE。但是否意味着每步都要仔细考虑指针越界?不然,那样程序会写的很累很乱

2014-12-05 11:06:29 962

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

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

原创 三数之和为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 374

原创 word ladder 2 的复杂实现

采用分治法的思想。(1)把所有两数之和计算出来,并保存在multimap中。放在unordered_multimap中的效率更高,但是因为其采用hash定位元素的方法,导致map中的数据不能按序索引。故要放弃unordered,虽然在有的版本中unordered的某些类型可以保持一定顺序,但本质是无序的。(2)对关联容器进行删除操作后,迭代器就会失效。这个一定要注意。例如:auto p =

2014-12-04 12:35:50 407

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

原创 最长无重复子串的DP实现

这道题能算DP吗?那要看是否具备最优子结构。我的分析是没有明显的子结构性质。例如当求下表为 i 的最长无重复子串时,要考虑两类情况。(1) s[ i ] 是否在字符串s之前的位置出现过,如果没有则长度 len++ ;(2) 如果出现过,分两种情况讨论(是否出出现在当前处理的子串中)(len表示当前处理的子串的长度)a> 在。那好办,直接更新len = i -  (出现位置下标) ;

2014-12-02 10:17:08 756

原创 最长无重复子串的简单实现

最简单实现的必须要搞定,之后再说更高级的办法。程序如果总是bug,不是你的问题,你只是需要一个break,否则就会一直呆在bug的死循环中。解决问题最好的办法一定不是死磕到底,而是要学会放一放但不要放到遗忘,而要等待时机卷土重来。int lengthOfLongestSubstring(string s) { if(s=="") return 0; in

2014-12-01 17:57:23 306

原创 unordered_* C++11的hash_*

(1)为什么不叫hash_*,例如 hash_map hash_set ...Since there was no hash table defined in the C++ standard library, different implementors of the standard libraries would provide a non-standard hash table o

2014-11-26 16:32:28 420

原创 Erase导致的迭代器失效分析(C++11)

循环中的erase:(1)对于关联式容器,erase之后什么也不返回,则后续的迭代器无法向下,即不能在执行++it或it--操作。需要做的是在删除时,进行it++,让迭代器走下去就OK。(2)对于序列式容器,erase之后返回的是下一个迭代器,但会导致后续的迭代器全部失效,此时如果想要循环继续,要保存迭代器的返回值,从此处开始迭代。无论哪种容器,常规的三段式for( )都不再适用。

2014-11-26 10:00:49 2268

空空如也

空空如也

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

TA关注的人

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