
lintcode题解
文章平均质量分 79
lang的飞起
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
DFS-带重复元素的全排列
此题是全排列问题的变形,给出的列表中有重复数字,需要去重。解决全排列问题的思路参见DFS-全排列问题去重思路:以[1,2,2]为例,可以要求index=1的数字2在最后生成的排列中一定要在index=2的数字2的前面,强制规定了顺序,避免了重复。即先从小到大排序,使相同的数字聚在一起,若前后2个数字相同,访问后一个数字的时候,前一个数字必须已经访问过了。只需添加一行代码if(i>0&&nums原创 2017-10-07 16:02:54 · 1996 阅读 · 0 评论 -
二叉树专题-lintcode递归与非递归遍历
二叉树的基本遍历方法是lintcode题目中的常用思想,有的题目还会要求写非递归的代码。现以递归的先序遍历为例子,分析非递归的写法。如果用递归的写法,很容易:void preOrder(TreeNode *T,vector& result){ if(T){ result.push_back(T->val); preOrder(原创 2017-10-16 15:27:07 · 292 阅读 · 0 评论 -
DFS-lintcode解法总结
在做过了前面几道深搜的题目后,慢慢地会了深搜的思考方式。这里做出总结,可以看出题目都有一些共性。还没做过题目的可以看看这些例题:求全排列求组合生成括号恢复IP地址单词搜索做了以上这些题目后,我们可以总结出,深搜往往是解决这样的问题:求满足条件的所有可行解,判断已知的一条路径是否符合条件。再往细分,可以看成一下几类:给一个数组,求满足条件的所有原创 2017-10-15 16:07:18 · 305 阅读 · 0 评论 -
二叉树专题-lintcode翻转二叉树
利用递归,交换左右子树即可,属于容易题class Solution {public: /** * @param root: a TreeNode, the root of the binary tree * @return: nothing */ void invertBinaryTree(TreeNode *root) { //原创 2017-10-31 15:31:16 · 281 阅读 · 0 评论 -
二叉树专题-验证二叉查找树
注意,题目中给的定义是严格小于,严格大于,不包含等于。这样,每个位置的值实际上必须在一个区间内。可以用递归的先序遍历的方法,先判断根是否在对应区间内,再判断左子树与右子树。举一个例子: 对于根节点,任意取;向左,需要严格小于1,故区间变为[负无穷,1),向右,需要大于1,故区间变为(1,正无穷];走到4时,区间为(1,3),4不在这个区间内,即不是二叉查找树 例子中的正原创 2017-10-23 09:37:49 · 636 阅读 · 0 评论 -
DFS-lintcode单词搜索(word-search)
类似于迷宫,判断是否存在满足条件的一条路径,还是用深搜的方法来解决。前面做过了许多的深搜题,给出的都是一维数组,字符串等,这里给出的是二维数组,实际上需要变化只是状态的扩展而已,还是用画图的方法来分析。以word = "ABCCED"为例由于没有规定起点的位置,应该是每一个位置都要尝试。[0][0]的位置为A,word[0]也为A,符合,扩展状态,相邻的有B和S,B是符合的。继续向下,B的原创 2017-10-13 09:02:23 · 397 阅读 · 0 评论 -
二叉树专题-lintcode路径相关
二叉树中路径相关的问题一直是常考题,这也是深搜的问题。由于路径要从根节点开始,故也是一个先序遍历的问题。 不熟悉的话,建议看一下这几个例子,熟悉一下深度优先搜索和二叉树的遍历:DFS求全排列 DFS生成括号 二叉树的遍历 来看一下几道题目: 典型的递归深搜,如果对前面DFS的例子熟悉的话,很容易能解决。搜到了叶子结点,然后存入即可。vector binar原创 2017-10-20 15:48:35 · 216 阅读 · 0 评论 -
DFS-lintcode恢复ip地址(Restore IP Addresses)
典型的DFS找满足条件的所有可行解。ip地址由4部分组成,每部分范围为0-255,容易忽略的是:每部分中0是可行的,但多个连续0如192.168.000.1是非法的,192.168.001.1这样前面有多余0的也是非法的,关键在于如何将这些条件转化为深搜中的条件不熟悉深搜的可以先看看求排列组合的深搜题:DFS求全排列 DFS求组合分析样例,第一部分的所有可能为2,25,255原创 2017-10-11 15:27:52 · 859 阅读 · 0 评论 -
DFS-求全排列
DFS-求全排列以[1,2,3]为例,若第一个元素为1,则还要求[2,3]的全排列;第一个元素为2,则还有求[1,3]的全排列........故可用递归实现深度优先遍历,遍历出所有的可能vector> permute(vector &nums) { // write your code here vector> res; vect原创 2017-10-05 10:11:41 · 836 阅读 · 0 评论 -
二叉树专题-lintcode二叉树的层序遍历
层序遍历算是遍历方式中,比较容易掌握的,实质就是宽度优先遍历,BFS的基本代码块如下;void BFS(){ 创建队列 第一个元素入队 while(队列非空){ 取队首元素top 出队 访问top 下一层的元素按顺序入队 }} 放到二叉树的遍历中来看,首先根节点入队,根出队,访问根节点,再入队左孩子,入队右孩子;这样再出队时,就是访问的第二层的左侧...原创 2017-10-19 17:46:15 · 242 阅读 · 0 评论 -
二叉树专题-根据前序和中序序列构造二叉树
经典的二叉树构造的问题,例子:(注意题目中限定了,没有重复的元素),先序为2143,中序为1423我们先手算一下,看看是如何构造的。先序第一个为2,则根为2,那么去中序中找2,就能够区分左右子树了。14在左子树,3在右子树。且左子树的先序序列为14,中序也为14.....可以分析出来这是一个递归的过程。手工算到最后,很容易构造出二叉树。故递归函数必须要有preL,preR,inL,原创 2017-10-27 14:50:00 · 7261 阅读 · 0 评论 -
DFS-intcode求组合
典型的DFS求所有满足条件的解。分析样例,从[1,2,3,4]中选2个数组合,[2,4],[4,2]是相同的,我们手算的过程应该是拿出1与后面[2,3,4]依次组合,2与[3,4]依次组合,3与4组合,4后面没有数了,结束。可以立刻画出搜索过程的示意图:利用start变量,每一层[start,n]遍历,很容易实现手算的过程转化为DFS的代码:class Solution {p原创 2017-10-10 15:55:42 · 373 阅读 · 0 评论 -
DFS-lintcode生成括号
组合的问题往往用DFS搜索,关键是如何组合能满足合法括号的条件,可以用图来进行思考:以n=3为例A:由于n=3,只能有3个左括号,3个右括号,已经有了3个左括号,不能再放左括号了,故只能再往右侧走,得到((()))B:同上,(()(已经有3个左括号了,只能再放右括号,往C走,得到(()())D:(())(已有3个左括号了,只能放右括号,得到(())()继续往后,可以得到剩余的组合原创 2017-10-09 18:30:21 · 465 阅读 · 0 评论 -
二叉树专题-lintcode非递归遍历与总结
紧接着上一篇文章讨论后序遍历的非递归写法,可以先看看上一篇文章:递归与非递归遍历 上一篇文章已经讨论到了:后序遍历要求最后访问根节点,访问完左子树后,要想进入右子树,无法直接跳入左子树,必须要有根的信息,从根节点才可进入右子树。但是栈中只保存了一次根的信息,出栈后获取了根,访问右子树,访问完了后便丢失了根的信息。这个特点导致了后序遍历的非递归写法比先序,中序复杂。 我们有了将节点入栈2原创 2017-10-18 15:26:53 · 262 阅读 · 0 评论 -
二分法专题-lintcode二分法问题解惑
二分法是常考的算法,适用于:在一个有序的序列中,找第一个满足某条件的位置(当然也可以找满足某条件的最后一个位置)学习过程中让人迷惑的问题有:上下限的确定,low=0,high=n-1还是low=0,high=n循环条件low循环中low=mid还是low=mid+1,high=mid还是high=mid-1有些情况无法退出循环,即是要mid=(low+high)/2还是mid=(l原创 2017-11-27 09:02:08 · 504 阅读 · 0 评论