摘要: 题目:Given a binary tree, flatten it to a linked list in-place.For example,Given 1 / \ 2 5 / \ \ 3 4 6The flattened tree should look like: 1 \ 2 \ 3 \ 4 \ 5 \ 6其实就是把二叉树按前序遍历顺序以右指针为next搞成一... 阅读全文
posted @ 2013-11-16 02:36 月窟仙人 阅读(121) 评论(0) 推荐(0) 编辑
摘要: leetcode上的题目是这样的:Given a binary tree, find the maximum path sum.The path may start and end at any node in the tree.For example:Given the below binary tree, 1 / \ 2 3Return6.这道题目跟那道求数组里子数组和最大的题目类似,使用的是分治方法,有以下三种情况:对于一个结点,以该结点为根,最大和的路径会出现在1.根的左子树中2.根的右子树中3.包含根的路径,起始与终止结点分别在左、右子树中思路清晰后... 阅读全文
posted @ 2013-11-16 01:32 月窟仙人 阅读(164) 评论(0) 推荐(0) 编辑
摘要: LeetCode上一道题目递归实现后序遍历我在OJ上直接使用了Tag的方法标志是第几次访问结点来区分,代码如下: 1 vector postorderTraversal(TreeNode *root) { 2 // IMPORTANT: Please reset any member data you declared, as 3 // the same Solution instance will be reused for each test case. 4 vector result; 5 if(root==NULL) 6... 阅读全文
posted @ 2013-11-16 00:57 月窟仙人 阅读(152) 评论(0) 推荐(0) 编辑
摘要: 归并排序归并排序Table of Contents1 归并排序1.1 原理1.2 实现1.3 性能评估1 归并排序1.1 原理归并排序是Divide and Conquer思想,也就是分而治之。先看划分的子问题。假设对已经存在并且有序的两个序列A、B进行合并,如何进行?很显然可以新建一个序列C,长度是A与B长度之和,从左至右依次扫描A、B,将较小的项放入C直到A、B中所有元素都扫描结束即可。1.2 实现对于给定的数组A,A[p..r]与A[r+1..q]两部分均已有序,下面实现对此两部分合并,使A[p..q]最终有序。 void merge(int A[],int p,int r,int... 阅读全文
posted @ 2013-05-18 20:44 月窟仙人 阅读(122) 评论(0) 推荐(0) 编辑
摘要: 原理 从形象开始,先看下面这一张图。 图 1:扑克牌理牌1 这是大家玩扑克牌的摸牌阶段,我们使用左手拿着已经摸到并排好大小的牌,右手从牌堆里边摸牌,每摸一张牌就将其插入到左手理顺的牌中,插入后保持其大小顺序。 再把这个过程抽象化,我们的扑克牌就是输入的待排序序列,两只手看成序列的两个部分。已经排序的和未排序的两部分,每次不断的从未排序的部分中取一个数,到已经排序的 部分中找到合适的位置插入。通常是自右向左依次比较来确定。实现 我们使用数组实现上面的过程。初始状态下,数组的首元素为已排序部分,从第二个元素开始插入排序。C语言的实现: 1 void insertSort(int A[]... 阅读全文
posted @ 2013-05-18 15:48 月窟仙人 阅读(183) 评论(0) 推荐(0) 编辑
摘要: 快速排序及精确性能统计快速排序及精确性能统计Table of Contents1 快速排序1.1 快速排序算法1.2 实现1.2.1 单向划分1.2.2 双向划分1.2.3 使用随机数划分1.3 性能评估1.3.1 时间复杂度1.3.2 简单统计1.3.3 优化实现1 快速排序1.1 快速排序算法快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。 步骤为:从数列中挑出一个元素,称为 "基准"(pivot),重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可 阅读全文
posted @ 2013-03-10 19:13 月窟仙人 阅读(1199) 评论(3) 推荐(1) 编辑
摘要: 实现网站上的分页功能,其实没有什么难度,只要逻辑不出差错就可以正常工作了。至于代码写的怎样也就很少有人关心了,今天把分页按照思路写了一下,然后再进行优化。当然无论写的功能有多少,我们总是希望要能够复用,下次就不用再写了。每次使用也不会出错,健壮性很强。最后呢就是任何一个新人能够在几分钟内读懂代码,维护性好。同时达到这些要求,那就是完美! 这个分页的功能很一般,分别实现:第一页,最后一页,下一页,上一页,跳到某一页。主要涉及到的参数如下:rPerPage:每页记录数rCount:总记录数dCount:每次显示的可选择的页码(例如当前页为2时,有[1][2][3][4][5][6][7][8... 阅读全文
posted @ 2013-01-30 23:44 月窟仙人 阅读(167) 评论(0) 推荐(0) 编辑
摘要: 前面三篇是关于javascript的函数式特性:javascript之典型高阶函数javascript之典型高阶函数二javascript之Partial Application 索性就把形式化方法从头复习一遍吧,顺便也温习下f#,并尝试使用javascript来表现一下,同时也会加入C#作为对比。关于f#,请阅读维基百科:F# 为什么要学习函数式编程?原因有太多,每个人都有他们的说法。而对于我,因为当我第一次在C#中使用LINQ、使用Lambda时,感到非常惊讶,怎么会有这样的用法?但当时仅仅停留在使用的层面,没能理解为什么,或者是怎么做到的。直到学习了这门课程之后,我才真正明白。所... 阅读全文
posted @ 2013-01-25 20:58 月窟仙人 阅读(1347) 评论(2) 推荐(1) 编辑
摘要: 这一次来学习一下Partial Application。我们先看一下函数的介绍,在维基上有简单的介绍:在数学中,一个函数是描述每个输入值对应唯一输出值的这种对应关系,符号为 f(x)。例如,表达式 f(x)=x2表示了一个函数 f,其中每个输入值x都与唯一输出值x2相联系。因此,如果一个输入值为3,那么它所对应的输出值为9。而g(x,y) = xy有两个参量x和y,以乘积xy为值。 上面描述了函数(为方便假设x,y都是int),并且给出了函数的两个例子,先换一种方式来看,f(x)可以表示为:x -> y(x2),即经经过f到x2的映射,写成 int -> int。接受一个int 返 阅读全文
posted @ 2013-01-10 01:22 月窟仙人 阅读(1473) 评论(4) 推荐(4) 编辑
摘要: 前言 在前一篇文章javascript之典型高阶函数中主要实现了几个典型的functional函数。文章最后也提出了疑问,为啥那样的实现与F#之类的函数式语言“不太一样”呢?今天来试试更“函数式”的实现。另一种实现 同样地,尝试对之前实现的函数做一些改动,把for循环去掉。如何去掉呢?这里先要引入一个集合的归纳法定义: 一个集合要么是空集,要么是一个数与一个集合组成的数对 从定义可以看到,每一个集合都可以看作为一个数和一个集合的对。例如:{1,2,4,5} 可以认为是数 1 与 集合{2,4,5} 组成的一对,写成(1 , {2,4,5})。递归地,{2,4,5} 可以看成是(2 , ... 阅读全文
posted @ 2012-12-31 21:31 月窟仙人 阅读(1126) 评论(4) 推荐(3) 编辑