
lintcode
文章平均质量分 65
ddou_pan
这个作者很懒,什么都没留下…
展开
-
lintcode- 题106 排序链表转换为二分查找树
建立一棵高度平衡的二叉树,第一想法肯定是选取链表的中点节点作为树根。然后发现在构造根的左右孩子孩子的时候,又是从左右两个链表中挑选链表中点节点的过程,是一个递归的过程。不借助其他辅助空间的话,只能是遍历寻找链表的中点。挑选中点节点的过程可以用快慢指针完成,但是这种做法又需要注意一点,挑选出根节点以后,要把左半边链表,根前一个节点的next指针置空,否则递归过程中,根左子树就会挑不出正确的节点,构造...原创 2018-03-31 10:37:12 · 166 阅读 · 0 评论 -
lintcode202-线段树的查询
题目描述:思路:在查询过程中,可能会遇到三种情况,目标区间在本区间中点的左边; 在本区间中点的右边; 跨越本区间的中点。在左边的情况:从当前节点移动到左孩子节点。在右边的情况:从当前节点移动到右孩子节点。在中间的情况:从中间分开,两边都要考虑,取其大者。递归进行。代码:int query(SegmentTreeNode * root, int start, int end) { /...原创 2018-05-28 21:30:31 · 193 阅读 · 0 评论 -
lintcode448-Inorder Successor in BST
题目描述:题目意思在BST中找到中序遍历中某一个节点的后继节点。根据BST的特点,BST的中序遍历是一个有序序列。在此序列中找某一节点的后继,一种普通的方法就是中序遍历该BST,将结果存在数组中,二分查找目标节点的值,然后后一个就是该节点的后继,如果目标节点是数组最后一个元素,则该节点没有后继,返回NULL。本题想要得到O(h)的复杂度,h为树高。即从树根节点遍历到叶子节点的过程。思路:cur当前...原创 2018-05-29 18:38:15 · 381 阅读 · 0 评论 -
lintcode540-左旋右旋迭代器
题目描述:简单暴力的求解方法:在生成该迭代器的构造函数中,就将传入的两个vector按照要求的顺序放入一个vector中,剩下的两个方法就是判断下标是否到达数组尾部,返回当前下标的数组元素。代码:class ZigzagIterator {public: /* * @param v1: A 1d vector * @param v2: A 1d vector */...原创 2018-05-30 12:27:16 · 392 阅读 · 0 评论 -
lintcode392-打劫房屋
题目描述:唯一约束是不能连续拿两个房间的钱,只能是隔一个或者更多。此题可以利用动态规划的想法,利用一个数组arr, arr[i]表示i房间及其以前的可以拿到的最多金钱。 此时针对第i个房间,就有两种情况:1)拿第i个房间的钱,那么就不能拿i-1房间,拿到的钱就是 arr[i-2] + A[i] ...原创 2018-05-30 13:30:16 · 202 阅读 · 0 评论 -
lintcode514-栅栏染色
题目描述:刚看到题目也是不知道怎么做,就尝试了一下过程,发现有规律可循:在第1根柱子,有K种方法;到了第2根柱子,因为允许可以有两个颜色重复,所以就有了K*K中方法;但是到了第3根柱子,就要考虑分情况了:如果第3根柱子和第2根柱子的颜色相同,方法数就是第2根柱子的方法数,这时就要求第2根柱子和第1根不能是一样的颜色,所以方法数变成k*(K-1)种,这也是第3根柱子的方法数;如果第3根柱子和第2根柱...原创 2018-07-02 10:52:29 · 259 阅读 · 0 评论 -
lintcode1017-Similar RGB Color
题目描述:本题中对于一个给定的RGB字符串,找到一个形如“#AABBCC”的字符串使得similarity最大。通过观察可以发现,两两一组,可以分别找差值最小的,因为都是负的,所以肯定最后结果是最大的。当分离出两两一组时,当两个字母相同时,最相近的就是本身,直接放进结果中即可,如果两个字母不相同,无非就是三种情况:重复第一个字母两次, 第一个字母减一重复两次, 第一个字母加一重复两次。如果第一个字...原创 2018-07-02 12:32:46 · 282 阅读 · 0 评论 -
lintcode190-下一个排列
题目描述:题目思路:首先理解排列,简单认为排列起点为序列的全升序,终点是序列的全降序,(其实任何一个位置都可以作为起点)。从序列的后方逐渐往前,最终包括整个序列,思考当某一个子序列已经排列成全降序时,下一个排列就是从子序列中所有大于子序列前一个元素的元素中找到最小的,两者进行置换,然后将子序列排列成全升序。例:序列5,4,7,5,3,2全降序的子序列为7,5,3,2子序列前一个元素为4,子序列中大...原创 2018-06-27 17:24:32 · 193 阅读 · 0 评论 -
lintcode1259-Integer Replacement
题目描述:求最小的转换次数。这道题最初的想法就是把所有的情况都算一下,然后比较得出最小的。可以递归解决,直到N变成了1。递归想着要耗费大量时间,没想到也通过了,哈哈。代码:int integerReplacement(int n) { // Write your code here //普通递归思想,可以通过 if(n <= 1) ...原创 2018-07-03 12:10:24 · 172 阅读 · 0 评论 -
lintcode1314-Power of Two
题目描述:判断是否是2的幂,从二进制角度考虑,一个数的二进制表示中只有一位为1时,这个数就是2的幂,即只要循环遍历一下数的二进制位数,判断1是否只出现了一次。代码:bool isPowerOfTwo(int n) { // Write your code here if(n < 0) return false; if(n...原创 2018-07-03 13:27:19 · 150 阅读 · 0 评论 -
lintcode643-Longest Absolute File Path
题目描述:思路:要找到最长路径的字符个数,需要逐层计算,记录最长的长度即可。 首先根据换行符将字符串拆成一个个的片段,存起来分别判断,在拆分的过程中直接去掉换行符。 层数的判断可以根据每个字符片段开始的‘\t’个数。 如果当前片段没有字符‘.’,当前表示一个文件夹,用一个数组存起来当前的长度。 否...原创 2018-08-04 15:52:42 · 215 阅读 · 0 评论 -
lintcode904-加一链表
题目描述:给定一个非负整数,这个整数表示为一个非空的单链表,每个节点表示这个整数的一位。返回这个整数加一。除了0本身,所有数字在最高位前都没有0。列表的头节点存的是这个整数的最高位。样例:给出链表1 -> 2 -> 3 -> null,返回 1 -> 2 -> 4 -> null。 思路:看到这个每个节点表示一位,主要难点在于链表表示...原创 2018-08-06 16:56:55 · 243 阅读 · 0 评论 -
lintcode203-线段树的修改
题目描述:思路:线段树的叶子节点就是数组中每一个位置的元素值,所以先找到要修改的位置,即先到达要修改的叶子节点,修改该节点的max值,然后再从叶子节点回到根节点,返回过程中,比较节点的左右孩子的max值,取两者较大者作为本节点的max值,这样无论value值和max值的大小关系,都作为一种情况考虑。代码:void modify(SegmentTreeNode * root, int index, ...原创 2018-05-28 21:25:43 · 163 阅读 · 0 评论 -
lintcode370-将表达式转换为逆波兰表达式
题目描述:将表达式处理成逆波兰表达式,主要处理的就是优先级问题,将括号去掉,用操作符的先后顺序表示运算顺序。逆波兰表达式中操作数的顺序和原表达式中操作数的顺序是一样的,也就是说在原表达式遍历过程中,如果判断是操作数,直接放入结果中。重点是操作符的放入顺序,这个是决定运算顺序的关键。操作符一共有 ( + - * / ) 六种, 遍历到的操作符和当前栈顶操作符进行比较。当遍历到的操作符比栈顶的操作符优...原创 2018-05-16 20:57:51 · 273 阅读 · 0 评论 -
lintcode-题99 重排链表
不改变节点值,意思是只能是调整指针,将原来节点进行链接,不能新创建节点。本题重点: 在将一个节点插入到前面链表中以后,要能够很快找到该节点的前一个节点。肯定不能每次都遍历一次链表,时间复杂度太高。如果不限制额外空间的话,可以有一种比较简单的做法,利用数组将所有节点的指针都存起来,然后依次进行插入,每次通过数组下标进行访问直接拿到节点的上一个节点。额外空间复杂度O(N)注意 每次插入以后,需要...原创 2018-03-29 12:50:18 · 305 阅读 · 0 评论 -
lintcode363-接雨水
题目描述:要求能接水的数量。每个位置能不能接水,能接多少水,取决于该位置左右两边的最高高度中的较小者。如果该位置就是从左边开始的最高高度,则该位置不能接水,如果该位置不是左右两边的最高高度,则该位置能接的水量就是左右最高高度中的较小者减去该位置的高度。最左边和最右边不管是不是最高高度,都不能接水。为能快速得到某一位置左边的最高高度和右边的最高高度,采用两个数组left和right。left[i] ...原创 2018-05-17 19:50:34 · 240 阅读 · 0 评论 -
lintcode-453 将二叉树拆成链表
题目描述:要求不使用额外空间,并且将二叉树变成链表,首先想到的就是递归的遍历方式。然而在递归过程中,需要有一个不因递归层数而变化的变量来记录现在已经构造完成的链表的尾部,并不断将遍历过程中的节点加入到链表尾部。还有一个问题: 用树节点的右孩子指针当做链表的next指针。这就需要保存节点的右孩子,否则就会丢失,递归回到本层时,通过保存右孩子的临时变量来继续进行遍历。而不是通过本层节点的right指针...原创 2018-05-11 20:42:56 · 252 阅读 · 0 评论 -
lintcode-二叉树所有路径
转载博客:https://blog.youkuaiyun.com/nawuyao/article/details/51087709问题描述:给一棵二叉树,找出从根节点到叶子节点的所有路径 样例 给出下面这棵二叉树:1 / \ 2 3 \ 5 所有根到叶子的路径为:[ “1->2->5”, “1->3” ]分析:一般二叉树的问题用递归解决比较简洁。在库文件str...转载 2018-05-11 21:06:47 · 149 阅读 · 0 评论 -
lintcode1396-集合合并
题目描述:解题思路:构建一个key-value对,key为数组元素,value表示该元素在第几个集合中; 将所有的集合中的元素都拷贝到一个数组中, 根据元素排序,使得相同的元素都在一起,然后更改下标。 循环检测,直到没有可以更改的元素为止。 统计此时元素有几个下标,就是剩下了几个...原创 2018-05-15 09:03:55 · 218 阅读 · 0 评论 -
lintcode1399-拿硬币
题目描述:本题是只能从最左边或者右边拿k次,可以进行k次遍历,开始k次都从最左边拿,然后是从左边拿k-1个,从右边拿1个......一直到全部K个都是从右边拿,在此过程中,利用一个变量保存最大和的情况。最后退出返回。代码:int takeCoins(vector<int> &list, int k) { // Write your code here if(li...原创 2018-05-15 10:05:05 · 570 阅读 · 0 评论 -
lintcode187-加油站
题目描述:解题思路:往上有好多种思路,在这里写上我认为比较好理解的。 如果当前i,gas[i] - cost[i] < 0, 此加油站是不能作为起点的。 如果某一起点start,在遍历到加油站end时,出现汽车油量cur_gas<0,则 start不能作为起点。这种情况下,将start往前走一个,看能不能到达end,这样就可以在本次过程中,用...原创 2018-05-15 11:05:51 · 212 阅读 · 0 评论 -
lintcode176-图中两个点之间的路线
题目描述:对于本题,本能想到深度优先搜索。递归实现, 一直走到当前路线最后一个节点。当递归回到s节点,并且没有找到t节点,才能认为是不存在路线。图中可能有不同的节点指向同一个节点,这样就需要一个数据结构来保存每一个节点的访问情况,只访问没有访问过的节点,这样才不会超时。class Solution {public: /* * @param graph: A list of Di...原创 2018-05-15 15:49:21 · 265 阅读 · 0 评论 -
lintcode137-克隆图
题目描述:本题重点在于避免重复生成节点,避免在构造节点的相邻节点时插入重复节点。为避免超时问题,在遍历图的过程中,就生成新节点,并构造节点的相邻节点。代码:UndirectedGraphNode* cloneGraph(UndirectedGraphNode* node) { // write your code here if(node == NULL) ...原创 2018-05-15 17:40:01 · 206 阅读 · 0 评论 -
lintcode189-丢失的第一个正整数
题目描述:如果不做空间的要求,可以利用哈希的思想,元素i放在下标为i的位置。然后遍历辅助空间,第一个没有赋值的就是答案。要求常数级别的空间,排序就只能在原数组上进行。不是抹掉原来位置的元素,而是交换,使得下标为i的位置元素为i+1(正整数从1开始). 如果数组元素的范围都是数组长度范围内,交换完成以后,每一个元素都被交换到正确的位置。如果有大于数组长度的元素,那1~数组长度范围内肯定有空缺,交换完...原创 2018-05-15 18:44:51 · 257 阅读 · 0 评论 -
lintcode424-逆波兰表达式求值
题目描述:给出已有的逆波兰表达式,根据运算规则计算是比较简单的,遇到的是操作数,string转换成int,压入到栈中,遇到的是操作符时,从栈中弹出两个操作数,进行计算,再把计算结果压入到栈中,遍历完一遍时,栈中的值就是整个表达式的结果。不需要考虑优先级问题以及括号问题。此处需要注意的一点是第一次从栈中弹出的是第二个操作数,第二次弹出的才是第一个操作数。这个会对减法和除法产生影响。代码:int ev...原创 2018-05-16 19:25:03 · 161 阅读 · 0 评论 -
4的幂(Power of Four)
题目描述:在网上看到一个特别棒的思路,在这里记录一下。思路: 如果使用循环或者递归的话,此题就容易许多,如果能整除,就一直整除下去,直到不能整除,判断是不是1即可。不使用循环的情况,是4的幂一定就是2的幂,但是是2的幂不一定是4的幂,是2的幂满足二进制表示中只有一个1,但是判断是否是4的幂,在此条件的基础上还要在满足另一个条件:1的位数一定要是在奇数位。判断条件:先判断是不是2...原创 2018-09-01 16:15:18 · 1445 阅读 · 0 评论