算法渐悟
文章平均质量分 67
未竟之梦
这个作者很懒,什么都没留下…
展开
-
二叉树的序列化
题目描述二叉树被记录成文件的过程叫做二叉树的序列化。序列化的方法有很多,这里我们采用括号序列的方法将其序列化,所谓括号序列指的是对于一个节点生成一个括号,括号内是其子树的括号序列,其中左儿子(若存在)的括号在前,右儿子(若存在)的括号在后。对于给定的树,请设计高效的算法,将其序列化。给定一个树的根节点指针root,请返回一个字符串,代表其序列化后的括号序列。思路:递归方原创 2016-03-29 17:03:10 · 433 阅读 · 0 评论 -
LeetCode 132 Palindrome Partitioning II--In C++
思路:因为做了上一道Palindrome Partitioning,所以一个很简单粗暴的做法就是在上题基础上修改,然而这注定是要TLE的。因为问题的需求已经不一样了,在这道题中只问切分多少次能够产生所有子串为回文的效果。全程只需要保留一个数字即可。想到了动态规划。考虑了很多状态的表示法,都不怎么可行。最后想到了用一个数组cp来表示在字符串s中角标i和i之后的部分需要切cp[i-1]次。原创 2016-06-18 11:15:51 · 448 阅读 · 0 评论 -
LeetCode 115 Distinct Subsequences--In C++
思路:这个问题让人联想到最长公共子序列的问题,因此可以用动态规划的问题来解决。最难的部分在于状态迁移的实际含义,这点好推出来,却很难理解。和最长公共子序列的问题一样,用dp[i][j]的数组来表示状态,含义为在s中取i个字符,在t中取j个字符,s中i个字符能够得到多少个t中j个字符组成的序列。很明显当j大于i时,结果一定为0。当j等于0时,结果一定为1。这就是边界条件了。同时注意到,当原创 2016-06-12 11:31:19 · 259 阅读 · 0 评论 -
LeetCode 56 Merge Intervals--In C++
思路:主要想法是先从Intervals中取出所有的int值,封装到一个Node节点中,节点里保存了他是不是起点,与之匹配的值,和自己的值等3个信息。然后对Node类型的数组workspace进行排序。排序策略为:1.两个点值不相等,值小的排前面。2.两个点值相等,且一个为起点,一个为终点,则起点排前面。3.两个点值相等,且都为起点,终点大的排前面。4,两个点值相等,且都为终点,起点大的原创 2016-05-23 10:49:25 · 717 阅读 · 0 评论 -
LeetCode 90 Subsets II--In C++
思路:由于这道题增加了冗余的属性,所以如果用Subset 1中的暴力递归进行求解的话,会浪费很多时间在扫描判断是否有重复值上。因此,类似于全排列的那个题,想到了在之前的基础上添加一个元素即可形成全新的子集的思路。用一个vector>> newadd变量来记录:每增加一个元素,就增加的子集。举例:比如1,2,2这三个元素。首先newadd中加入一个空集。当1加入之后,增加了{原创 2016-06-04 16:01:54 · 560 阅读 · 0 评论 -
LeetCode 64 Minimum Path Sum--In C++
思路:用动态规划的话,速度是最快的。状态迁移方程:mat[i][j] = (mat[i][j + 1]即要找到一个格子的下边和右边较小的值,在加上grid中给他的值,作为mat中这个位置的最终值。int minPathSum(vector>& grid) { int m = grid.size(); if (m == 0){ return 0; } int n =原创 2016-05-25 16:23:24 · 433 阅读 · 0 评论 -
二叉树的镜像
题目描述操作给定的二叉树,将其变换为源二叉树的镜像。输入描述:二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9 7 5原创 2016-04-11 10:26:05 · 225 阅读 · 0 评论 -
对称的二叉树
题目描述请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。思路分别按照左中右,和右中左的次序遍历该二叉树,如果得到的序列完全相同,则为对称二叉树。要注意一点,对空子树不能简单的不去理会,而是要置一个特别的数字,防止一些节点值全相同的特殊情况发生。如下图:附程序import java.util.Array原创 2016-04-11 10:00:55 · 491 阅读 · 0 评论 -
二叉树遍历
题目描述二叉树的前序、中序、后序遍历的定义: 前序遍历:对任一子树,先访问跟,然后遍历其左子树,最后遍历其右子树;中序遍历:对任一子树,先遍历其左子树,然后访问根,最后遍历其右子树; 后序遍历:对任一子树,先遍历其左子树,然后遍历其右子树,最后访问根。 给定一棵二叉树的前序遍历和中序遍历,求其后序遍历(提示:给定前序遍历与中序遍历能够唯一确定后序遍历)。输入描述:两个字符串,其长度n均原创 2016-04-04 22:42:32 · 253 阅读 · 0 评论 -
LeetCode22GenerateParentheses--In Java
这个问题让人想到火车进站的次序问题,解的数量可以用卡特兰数求出。 因此我想到其实括号的排列和栈混洗的各个情况是一一对应的。 现有1、2、3三个数字,栈混洗后有123,132,213,231,321五种情况,312是不合法的。 而观察可以发现123这种情况对应着“()()()”这种情况,而132则对应着“()(())”这种情况,因为左括号代表一次入栈,右括号代表一次出栈,同理213就是“原创 2016-02-21 19:32:58 · 595 阅读 · 0 评论 -
LeetCode 30 Substring with Concatenation of All Words--In Java
主要想法为:建立一个hashmap保存所有words中的单词,记录下它们各自出现的次数。然后外层循环从文本串中依次取下长度等于words中单词拼接后长度的子串,程序中为变量ps。内层循环从ps中每次截取一个单词,这时我们拷贝一份先前的hashmap,这个单词出现一次,就在hashmap的指定键值处减一,如果发生有一个值被减到小于0,则是一次失败的匹配,内层循环退出。同时,如果根本没有找到这个从原创 2016-02-23 19:14:05 · 338 阅读 · 0 评论 -
LeetCode 40 Combination Sum II--In Java
主要思路为:利用递归,进行深度优先搜索。构造递归函数f(int st,int st2,int lef,List ar),st表示本轮搜索ar中开始元素的下标,st2表示最后一个纳入ar的元素下标。例如f(0,0,20,ar)的含义为:从第0个到第0个范围内的元素进行组合,还剩余的目标为20,已经判断合法的中间结果存在ar中。public static int[] orcan; publi原创 2016-02-26 07:34:29 · 349 阅读 · 0 评论 -
华为机试题--24点游戏--In Java
题目描述问题描述:给出4个1-10的数字,通过加减乘除,得到数字为24就算胜利输入:4个1-10的数字。[数字允许重复,测试用例保证无异常数字]输出:true or false这个问题首先能够想到的做法就是暴力枚举,但是这样的话情况太多,写的也太麻烦了点。所以用递归的方法来做是很方便的。但是要注意到的是,所给的4个数字的运算顺序并不一定是输入的顺序,而且加括号也原创 2016-03-06 16:27:00 · 890 阅读 · 0 评论 -
构造MaxTree
题目描述对于一个没有重复元素的整数数组,请用其中元素构造一棵MaxTree,MaxTree定义为一棵二叉树,其中的节点与数组元素一一对应,同时对于MaxTree的每棵子树,它的根的元素值为子树的最大值。现有一建树方法,对于数组中的每个元素,其在树中的父亲为数组中它左边比它大的第一个数和右边比它大的第一个http://write.blog.csdn.net/postedit?ref=tool原创 2016-03-29 22:29:10 · 731 阅读 · 0 评论 -
LeetCode 140 Word Break II--In C++
思路:首先想到的是递归的解法,但是考虑到TLE的问题,此路不通。其次是动态规划的版本,结合139 Word Break ,只需扩展那个动态数组就可以了。139中用一个bool数组表示dp[i]之前的串能否形成切分。那么在这个问题中,可以将最后一个成功切出来的单词挂在i角标的下面。这时,最好用一个vector的数组来存储最后一个切下的单词。这样先用动态规划扫一遍之后,会得到上图的结构。原创 2016-06-21 09:46:53 · 563 阅读 · 0 评论