leetcode题解
文章平均质量分 86
刷题是一个很有意思的过程,喜欢accepted的感觉,通过对代码不断地提交和修改来锻炼我们缜密的思维、不断加深对计算机的了解。欢迎加入刷题的队伍中来吧,leetcode,你值得拥有,走起~
mnmlist_tata
这个作者很懒,什么都没留下…
展开
-
leetcode_19_Remove Nth Node From End of List
思路:先让p指向head,p往后移动n个节点,然后让q指向head,p和q一起后移直至p指向最后一个结点,则q指向的结点即是倒数第n个结点。当然,倒数第len(链表的长度)个结点是一个特殊情况,直接head=head.next即可。原创 2015-02-03 10:42:09 · 687 阅读 · 0 评论 -
leetcode_61_Rotate List
本文的题意就是循环将后面的n个结点移动到前面去,所以,n有可能是大于链表的长度的,这是一个小小的陷阱。然后就是很简单的细节了,有点脑残,提交了好多次。原创 2015-02-01 15:20:03 · 991 阅读 · 0 评论 -
leetcode_24_Swap Nodes in Pairs
简单粗暴,首先让p指向第一个节点,若果p.next不为空,q指向p.next,交换p和q的值即可,如果p.next为空,退出。交换值后,让q.next赋值给p,如果q.next为空的话,退出循环。原创 2015-02-01 10:56:53 · 901 阅读 · 0 评论 -
leetcode_9_Palindrome Number
很简单粗暴的思路就是将整数转换为StringBuilder,然后前面和后面的字符分别相比,直至前面和后面的下标相遇程序终止,任何一次比较不想等就不成立。但上面说without extra space,为啥我的程序能通过?好吧,程序不算真的通过,我用到了额外的存储空间。原创 2015-01-28 08:29:53 · 907 阅读 · 1 评论 -
leetcode_8_String to Integer (atoi)
思路是很简洁的,但正负号,空格包括中间和字符串的开始和结尾的字符,字符串溢出,整数表示的最大数和负数能表示的最小数。。。。编程让人变的更加严谨,目测还有很大的提升空间。原创 2015-01-28 08:27:41 · 1066 阅读 · 0 评论 -
leetcode_7_Reverse Integer
思路倒是简洁明了,将整数的非符号部分的各位存储到一个数组里面,然后将各位组装起来就成为一个新的整数。当然,溢出,符号都是需要考虑的。原创 2015-01-28 08:25:17 · 940 阅读 · 2 评论 -
leetcode_6_ZigZag Conversion
思路:想了好久,思维总是局限在二维数组,找字符串的长度和二维数组的行列数之间的某种联系,想了好久,没有思路。然后,然后就上网看了一下,有一种思路说是用字符串数组即可,就想到了StringBuilder,直接Append多好,这得比二维数组高级多少啊!然后就用StringBuilder做这道题了。原创 2015-01-28 08:23:09 · 908 阅读 · 0 评论 -
leetcode_5_Longest Palindromic Substring
刚开始非常天真,以为stringBuilder.reverse() 和stingBuilder通过错位滑行就可以比较了,当然不行!因为最长子串很有可能不是从头开始的。但也可以从头到尾取子串错位滑行比较,但是时间代价太高,pass。想了好久,终于想到了,可以从每个字符开始,分别将字符前面和后面的字符进行比较,并将统计的结果给存储下来。但是也有可能最长回文子串的字符个数是偶数,这也是一种情况。将以上两种情况求得的结果进行比较,最长的回文子串就给求出来了。原创 2015-01-27 20:12:24 · 804 阅读 · 0 评论 -
leetcode_3_Longest Substring Without Repeating Characters
本题要求的是字符串的非重复最长子串,为了在最长的时间内判断子串是否有重复,很自然地就想到了HashSet(当然还有更好的方法,我女朋友就用数组进行判重),从头开始遍历直到出现重复的字符为止,将非重复的字符数目存储起来,并查出从开始处到重复字符第一次出现的地方,删去HashSet中从开始到重复字符第一次出现的地方的所有元素,并将count减去从开始处至重复字符第一次出现的地方的个数,然后从出现重复字符的下一个字符开始统计。将字符串遍历一遍,然后统计出最长的子串所含有的字符个数即可。 这题最容易原创 2015-01-27 19:53:45 · 814 阅读 · 0 评论 -
leetcode_2_Add Two Numbers
两个链表分别从第一个结点开始分别相加,大于10的进位和下两个结点的值一起相加直至两个结点都到链表的结尾,如果到链表结尾仍然有进位,创建一个新的节点放在较长的那个链表的后面。原创 2015-01-27 19:26:20 · 823 阅读 · 0 评论 -
leetcode_1_Two Sum
思路很简单,将所有的元素放入HashSet中,如果target-Numbers[i]在hashSet中,且Numbers[i]不等于target-Numbers[i]中,满足条件,将Numbers[i]和target-Numbers[i]的index放在数组里返回即可。原创 2015-01-27 19:13:47 · 849 阅读 · 0 评论 -
leetcode_186_Reverse Words in a String
Given an input string, reverse the string word by word.For example,Given s = "the sky is blue",return "blue is sky the".click to show clarification.Clarification:What constitutes原创 2014-09-01 10:44:00 · 850 阅读 · 0 评论 -
leetcode_83_Remove Duplicates from Sorted List
思路:simple,从头到尾遍历结点,如果下一个结点不为空且当前结点和下一个节点相同,删除下一个结点,否则,遍历下一个结点。原创 2015-02-03 10:50:17 · 709 阅读 · 0 评论 -
leetcode_82_Remove Duplicates from Sorted List II
思路:大致思路就是,遍历链表找出重复元素的子列并删除重复元素子列,当然,第一个元素开始有重复元素的话比较特种,需要特殊考虑。删除子列的过程稍微有点绕,题目倒是不难理解。原创 2015-02-03 11:03:52 · 762 阅读 · 0 评论 -
leetcode_21_Merge Two Sorted Lists
思路:好像是数据结构上面的原题,就不多说了,通过比较把两个链表一起就可以了。需要注意的就是两个链表的head谁当新表的head问题,当然谁小谁当head 了,先比较一下即可。原创 2015-02-03 11:11:20 · 722 阅读 · 0 评论 -
leetcode_141_Linked List Cycle
思路:一想到唯一就直接联想到了hashSet,至于在不用额外存储空间的情况下把题目搞出来,这个,确实还没有想到,to be continued......原创 2015-02-03 11:17:28 · 804 阅读 · 0 评论 -
leetcode_142_Linked List Cycle II
思路:从头开始遍历链表并将结点的引用存储在HashSet中,出现重复的地方就是出现环的地方。原创 2015-02-04 20:00:03 · 712 阅读 · 0 评论 -
leetcode_92_Reverse Linked List II
思路:这种题目,举个例子能让思路更加清晰,通过在草纸上演算可知,题目要分两种情况,m==1和m>1的情况,然后就是围绕这两种情况展开讨论,删除后面的结点,然后将后面的结点添加到前面,一次搞定,bravo!原创 2015-02-04 21:01:39 · 775 阅读 · 0 评论 -
leetcode_86_Partition List
思路:刚开始试着把所有小于x的结点依次插到前面去,但是因为第一个和最后结点的问题真的把我搞得焦头烂额,后来想想,用我媳妇想到的方法可能更清晰一点,用两个链表分别连接小于和大于等于x 的结点,然后再把两个结点链接到一起,就可以了。在实施的时候稍微偷点懒,首先创建两个头节点,哎,现在终于明白头节点的巨大作用了,其实,按我的那个思路,先搞个头节点,然后再用两个引用pre和cur就可以轻松搞定本题了。做完本题感觉收获好大,头节点的出现真的让我可以很轻松地搞定许多前面我费了好大的劲才搞定的题目,尤其是涉及到在链原创 2015-02-05 21:57:59 · 2123 阅读 · 0 评论 -
leetcode_25_Reverse Nodes in k-Group
思路:大概思路就是找出K个结点的起始位置和并将这K 个结点采用头插法的方式依次插入到这K个结点开始位置的前面一个位置之后,就可以了。思路倒是很简单,但是指针所指的位置的捉摸是有点麻烦的,还有就是我竟然没有把创建的头节点和整个链表给链接起来。anyway,还是把这道题目给做出来了。原创 2015-02-07 11:01:03 · 764 阅读 · 0 评论 -
leetcode_143_Reorder List
思路:大概思路就是将后面的一半结点以倒序的方式依次插到前面一半的每一个结点的后面,考虑到后面一半的结点要倒序插入所以会用到栈。1.求出链表的长度2.将后边的结点依次入栈3.将栈里的元素依次插入到前面的结点后面原创 2015-02-07 15:36:34 · 678 阅读 · 0 评论 -
leetcode_160_Intersection of Two Linked Lists
思路:暴力解法,将第一个链表的所有结点放进HashSet,然后看第二个链表从头开始的第一个存在HashSet中的元素就是两个链表相交的地方。方法不够好,题目说的空间复杂度最好为O(1)原创 2015-02-07 16:09:59 · 683 阅读 · 0 评论 -
leetcode_94_Binary Tree Inorder Traversal
2.思路a.先遍历左子树直至左孩子为空b.然后看当前节点的右子树是否为空,为空,则访问当前节点,弹出当前节点,重新判断;不为空,访问当前节点,然后将当前节点弹出,并将当前节点的右孩子进栈,返回ac.这中间需要注意的是,在弹出当前节点后,在获得栈顶的当前节点前先判断下栈是否为空原创 2015-03-16 20:49:49 · 1110 阅读 · 0 评论 -
leetcode_102_Binary Tree Level Order Traversal
一般的层序遍历直接打印出结果,用队列即可,但是此次的要求尼是按层次打印结果,所以考虑到用两个队列来交替存储,遍历上一层次的同时将下一层的结点存储到另一个队列中,并在将上面一层的遍历完成后交换两个队列的值。原创 2015-03-20 13:58:40 · 1332 阅读 · 0 评论 -
leetcode_107_Binary Tree Level Order Traversal II
一般的层序遍历直接打印出结果,用队列即可,但是此次的要求尼是按层次打印结果,所以考虑到用两个队列来交替存储,遍历上一层次的同时将下一层的结点存储到另一个队列中,并在将上面一层的遍历完成后交换两个队列的值。最后,将结果列表调换下顺序即可。原创 2015-03-20 14:17:07 · 824 阅读 · 0 评论 -
leetcode_144_Binary Tree Preorder Traversal
具体思路和中序遍历是一致的,只是访问结点的值的时机不同罢了,具体思路参见:http://blog.csdn.net/mnmlist/article/details/44312315原创 2015-03-20 14:41:11 · 865 阅读 · 0 评论 -
leetcode_103_Binary Tree Zigzag Level Order Traversal
思路:具体的思路和层序遍历一致,只是需要将偶数层的结点值颠倒一下即可,时间略长,可见本方法并非好的方法。思路详见层序遍历:http://blog.csdn.net/mnmlist/article/details/44490975原创 2015-03-20 15:10:34 · 830 阅读 · 0 评论 -
leetcode_100_Same Tree
思路:由于这题标识为easy,判断两棵树是否相等,想到了用递归。有这几种可能,两棵树相等的充要条件为root的值相等&&左子树相等&&右子树相等,两棵树都为空时也相等,其中一棵为空时就不相等原创 2015-03-24 14:18:40 · 769 阅读 · 0 评论 -
leetcode_101_Symmetric Tree
思路:判断一棵树是否是左右对称的,用这样几种可能,左右子树都为空时对称,左右子树有一个不为空时不对称,子树结点值相等&&左子树的左孩子的结点值等于右子树的右孩子的结点值&&左子树右孩子的结点值等于右子树左孩子的结点值,OK!原创 2015-03-24 14:27:32 · 908 阅读 · 0 评论 -
leetcode_104_Maximum Depth of Binary Tree
思路:用递归,很简单,树为空时返回0,左子树为空且右子树为空时返回1,否则就返回左子树或右子树的最大深度再加1原创 2015-03-24 14:36:45 · 815 阅读 · 0 评论 -
leetcode_111_Minimum Depth of Binary Tree
思路:和求最大深度思路是类似的,只是题目要求的最小深度是到最近的叶子节点的最小深度,所以当一个节点的深度为0时,很显然是没有叶子节点的,应该取另外一个num并加1原创 2015-03-24 14:42:09 · 788 阅读 · 0 评论 -
leetcode_114_Flatten Binary Tree to Linked List
思路:按照中序遍历的方式将结点存储到一个list列表中,然后分别将各个节点的left赋值为空,将right指向下一个节点,最后将最后一个结点的right赋值为空即可生成题目要求的树结构。结果对了是对了,好像不太符合题目要求,题目要求 do it in-place,不知道我的算不算in place。很显然,从时间上来看,我想到的思路也不能算好。刚开始以为是要生成一个链表,走了好多弯路,发现返回值就是一个void,题目要实现的就是改变下树是结构而已。原创 2015-03-24 14:59:19 · 796 阅读 · 0 评论 -
leetcode_145_Binary Tree Postorder Traversal
思路:刚开始的时候由于刚做出前序和中序的遍历,落入这两种遍历的窠臼,总以为在中序遍历的基础上改改就可以了,但是,改了好久,费了了好大的劲,走了好多弯路,in vain!最后联想到后序遍历不就是在中序遍历的基础上,经由子树根节点访问右子树,然后再访问根节点,不是么?所以,想到再多用一个栈来标记是否是第一次访问子树根节点,第二次访问子树根节点时(当然不算第一次将所有左子树入栈的那一次)就存储根节点的值。bravo!It's done!原创 2015-03-25 08:39:58 · 784 阅读 · 0 评论 -
leetcode_23_Merge k Sorted Lists
思路:本来想模仿合并两个链表的方法,查找所有的lists链表一遍找出一个最小值,并将最小值链接到结果链表中,并将最小结点删除,将最小结点的next结点替代之,直至为null,将链表删去。但是当lists.size()比较大时,时间复杂度就上来了,而且每次只能选一个最小结点,O(N*N)的节奏。。。所以,想到不就是排序么,将所有的结点集合到一起,然后对其进行快速排序不就可以了么,啊哈,真的是这样,bravo!很显然,这种方法肯定不是最优方法,但是时间复杂度也只是O(N*logN),也是可以接受的。原创 2015-03-23 20:59:32 · 1001 阅读 · 0 评论 -
leetcode_112_Path Sum
思路:由于是root-to-leaf,马上就想到了后序遍历,直接遍历到叶子节点,把从根节点到叶子节点的值统计一下看其和是否等于sum,相等的话则返回true,不等的话继续遍历直到下一个叶子节点。。。循环直至遍历结束。只是感觉,这么简单的一个题目,用后序遍历来解,杀鸡用牛刀?这感觉还挺不错!大笑忽然感觉,这树的几种遍历方式可真的很有用。原创 2015-03-26 20:16:51 · 729 阅读 · 0 评论 -
leetcode_113_Path Sum II
思路:大致思路就是将pathsum 1中的存储节点的栈stack换成具有栈功能的LinkedList,这样每匹配依次将各个节点的值存储到一个list中,遍历完整棵树后返回一个满足条件的结点列表的列表。原创 2015-03-26 20:24:43 · 786 阅读 · 0 评论 -
leetcode_108_Convert Sorted Array to Binary Search Tree
思路:思路就是按二分查找的思路进行中序建树,递归建树。原创 2015-03-26 20:30:33 · 751 阅读 · 0 评论 -
leetcode_129_Sum Root to Leaf Numbers
思路:和pathsum系列是一个思路,后序遍历至某个节点,将root-to-leaf的所有结点的值表示成一个数和sum相加,直至遍历完所有的leaf结点,返回sum。原创 2015-03-26 20:37:07 · 903 阅读 · 0 评论 -
leetcode_98_Validate Binary Search Tree
思路:由于二叉排序树和对二叉树的中序遍历所形成的值是有序的是充分必要条件,所以仅需对二叉树进行中序遍历即可,并将遍历的结点的值存储到一个list中,然后依次比较list中的值,是有序的则二叉树为二叉排序树,否则则不是。当然,一个更好的方法是用一个temp暂存上一个结点的值,然后依次进行比较即可。原创 2015-03-26 20:48:01 · 764 阅读 · 0 评论 -
leetcode_117_Populating Next Right Pointers in Each Node II
思路:就是用两个list存储相邻两层的结点,把第i+1层结点存储到list中的同时,分别将第i层的各个节点指向下一个,跟Populating Next Right Pointers in Each Node I一个思路。原创 2015-03-29 10:53:43 · 892 阅读 · 0 评论