04 2016 档案

摘要:先自己在纸上画棵树,发现可以用stack实现迭代版的后序遍历,最开始先把root压入栈。另外维护一个栈,记录对应节点出栈的次数,如果是1,表明左右节点已输出,就输出;如果为0,说明左右节点还未压入栈,就把次数加1,且把左右节点压入栈。 阅读全文
posted @ 2016-04-14 20:43 co0oder 阅读(121) 评论(0) 推荐(0)
摘要:水题,把每一层的节点存入queue中,val存入vector,vector再存入stack(因为最后结果的顺序是最底层在最前面)。 耗时较多,留坑。 阅读全文
posted @ 2016-04-12 20:49 co0oder 阅读(130) 评论(0) 推荐(0)
摘要:一开始以为不直接连接的话就考虑隔层加钱,偶数层和奇数层分开算得两个结果,但是输入为[4,1,null,2,null,null,3]时最大值为4+3 = 7,4是第0层,3是3层。 因此要以节点为对象,而不是层。每个节点的情况分两种,抢和不抢,如果抢当前节点,那么左右节点不能抢;如果不抢,那么当前节点 阅读全文
posted @ 2016-04-12 20:38 co0oder 阅读(129) 评论(0) 推荐(0)
摘要:留坑 阅读全文
posted @ 2016-04-05 21:43 co0oder 阅读(174) 评论(0) 推荐(0)
摘要:ver0: 用递归,首先判断整个高度是否单调递增,如果是的话,从第一个高度开始,假设该高度是最终最大矩形的高度,得到面积,一直遍历到最后一个高度,这样就得出了最大面积;如果不是单调递增,则先得到最小高度的位置,根据递归得到最小高度左边的最大矩形面积,再得到最小高度右边的最大矩形面积,又得到以最小高度 阅读全文
posted @ 2016-04-05 21:15 co0oder 阅读(301) 评论(0) 推荐(0)
摘要:首先说说最初的但是不正确的思路,stk存值,初始化为输入数组的第一位。从左往右读入数组每一位,如果height[i]>stk.top(),说明stk.top()无法蓄水,pop掉,替换为height[i];如果height[i]<=stk.top(),那么从i开始遍历,直到找到大于等于stk.top 阅读全文
posted @ 2016-04-04 23:46 co0oder 阅读(136) 评论(0) 推荐(0)
摘要:和225类似,queue和stack的性质正好相反,因此在push时要进行处理。 维护两个stack:stk和tmp,stk存放与queue相反的顺序,比如queue为:1、4、5,stk为:5、4、1,这样stk.top()会一直等于queue.front()。 每次push进一个数x时,先把st 阅读全文
posted @ 2016-04-04 20:31 co0oder 阅读(154) 评论(0) 推荐(0)
摘要:用queue模拟stack,因为queue只能取front的值,和stack正好相反,因此核心思想是queue保持着与stack相反的顺序,一直逆序,所以每次push进一个新值后,要依次把新值之前的值排到队尾。比如原来q为4、5,push进1,q依次为:4、5、1;5、1、4;1、4、5. 对应的s 阅读全文
posted @ 2016-04-04 20:20 co0oder 阅读(111) 评论(0) 推荐(0)
摘要:难点在于如果在调用getMin()时只花常数时间。 维护两个vector,v存push进来的数,minHist存最小的数,这个最小的数是指v中从头到对应位置里最小的数,比如minHist中位置为i的数,这个数是v中从0到i(均包含)的所有数中最小的数,举个例子,依次push进4、5、1,那么minH 阅读全文
posted @ 2016-04-04 20:05 co0oder 阅读(100) 评论(0) 推荐(0)
摘要:最后输出结果中字母的顺序应该保留输入字符串中的顺序,而且字典序最小,比如输入"cbacdcbc",输出"acdb",这四个字母的先后顺序遵循输入中的顺序,同时字典序最小。 下面这份代码的大致思路是首先把s中每个字母出现次数统计一次,然后再遍历一次,minLetterIndex保存目前为止出现的字母中 阅读全文
posted @ 2016-04-04 19:45 co0oder 阅读(1327) 评论(0) 推荐(0)
摘要:Unix-style的path中,"."表示当前目录下的子目录,".."表示返回上一级目录,"..."的话保留(Input:"/..." Expected answer:"/...")。 因此维护一个stack,存放路径中文件夹的名字name,将path打散(split)后,一段段读入,如果是"." 阅读全文
posted @ 2016-04-04 18:01 co0oder 阅读(373) 评论(0) 推荐(0)
摘要:int转string string转int 阅读全文
posted @ 2016-04-04 16:53 co0oder 阅读(139) 评论(0) 推荐(0)
摘要:最简单的思路,如果lists.size()<=1,可直接处理;否则每次取lists最开始的两个节点,进行merge,然后push_back,同时删去最开始的两个节点,一直循环知道lists只剩下一个节点。 地狱般的460ms,更好更快算法待看,留坑。 阅读全文
posted @ 2016-04-04 16:12 co0oder 阅读(118) 评论(0) 推荐(0)
摘要:141的进阶版,不仅要判断是否存在cycle,还有找出cycle的起始节点。 首先如141所做,根据fast==slow判断是否存在cycle。 如果fast==slow,则slow重置为head,此时fast和slow都每次走一步,当两者相遇时,相遇点即为圆环开头。现在证明为什么slow重置为he 阅读全文
posted @ 2016-04-04 15:22 co0oder 阅读(144) 评论(0) 推荐(0)
摘要:判断一个链表是否存在循环(不是val的循环),即想象一个圆环,圆环可能还外连一根线,现在要判断链表是否含有这个环。 设置快慢两个节点,slow一次一步,fast一次两步,如果存在一个环,那么slow和fast必定会进入这个环,现在证明一旦进入环slow和fast必定会在循环中相遇。 设slow在环中 阅读全文
posted @ 2016-04-04 14:57 co0oder 阅读(234) 评论(0) 推荐(0)
摘要:最简单的思路,另开一个list,初始化为仅有head一个节点,head移动到下一个节点。然后开始比较head和tmp的val大小,如果head小,那么插在最前面(注意保持tmp为表头),如果head大,那么tmp一直遍历至表尾或至节点值比head大处。 89ms 更快的算法是先比较head和sort 阅读全文
posted @ 2016-04-03 21:56 co0oder 阅读(144) 评论(0) 推荐(0)
摘要:将链表分成三段,中间一段reverse后再链接。 链表中节点位置从1开始计数。 注意m可能为1,所以要加上if(last == start) head = end; 不然会丢失数据,因为reverse后head是reverse一段的最后一节点,只返回head的话head之前的节点全部丢失。 4ms 阅读全文
posted @ 2016-04-03 21:42 co0oder 阅读(184) 评论(0) 推荐(0)
摘要:ver0: 最简单的思路,得到中间节点,把这之后的节点放入stack中,再从head开始,把stack.top()插入。 具体解释:得到slow后,分两种情况考虑,链表长度为偶,slow为前半段的最后一个节点;链表长度为奇,slow为正中间节点的前一个节点。两种情况下reoder后slow->nex 阅读全文
posted @ 2016-04-03 20:49 co0oder 阅读(136) 评论(0) 推荐(0)
摘要:1 ListNode* reverseList(ListNode* head){ 2 if (head==NULL || head->next==NULL) return head; 3 ListNode *pre=head, *cur=pre->next, *post; 4 pre->next = NULL; 5 while (cur!=NULL){ ... 阅读全文
posted @ 2016-04-03 20:35 co0oder 阅读(140) 评论(0) 推荐(0)
摘要:输出数字a,保留两位小数 阅读全文
posted @ 2016-04-03 20:24 co0oder 阅读(156) 评论(0) 推荐(0)
摘要:得到带空格的string输入 阅读全文
posted @ 2016-04-03 20:23 co0oder 阅读(142) 评论(0) 推荐(0)
摘要:getMid函数中,fast一次走2步,slow一次走1步,因此假设全长len,len偶时,slow到达前半段的最后一个节点,len奇时,slow到达正中间的节点,两种情况中,slow->next均为后半段的起始节点。 阅读全文
posted @ 2016-04-03 20:22 co0oder 阅读(194) 评论(0) 推荐(0)

点击右上角即可分享
微信分享提示