LeetCode专栏
文章平均质量分 75
这里是LeetCode的专栏
chiiis
这个作者很懒,什么都没留下…
展开
-
Reverse Words in a String 翻转一个字符串里的单词顺序 @LeetCode
LeetCode新题,但是比较简单,直接用栈即可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 constitut原创 2014-08-13 06:31:56 · 2522 阅读 · 0 评论 -
Word Break II 求把字符串拆分为字典里的单词的所有方案 @LeetCode
这道题类似 Word Break 判断是否能把字符串拆分为字典里的单词 @LeetCode 只不过要求计算的并不仅仅是是否能拆分,而是要求出所有的拆分方案。因此用递归。但是直接递归做会超时,原因是LeetCode里有几个很长但是无法拆分的情况,所以就先跑一遍Word Break,先判断能否拆分,然后再进行拆分。递归思路就是,逐一尝试字典里的每一个单词,看看哪一个单词和S的开头部分匹配,如果匹配则原创 2014-08-13 05:16:27 · 5496 阅读 · 3 评论 -
Combination Sum II 无序数组中找组合(每个元素只能用一次)使得和为target@LeetCode@LeetCode
和上一题思想一样,区别在于每个元素只能用一次,所以start的位置也要改变。另外一个问题是如何处理返回大集合中有重复子集合的问题。最容易想到的就是用HashSet来过滤一遍,参考了http://blog.csdn.net/u011095253/article/details/9158423的大作后发现有一种更绿色的方法,就是多用一个while循环跳过相同的元素!这个技巧在很多情况下都很好用原创 2013-11-21 12:40:25 · 2423 阅读 · 0 评论 -
Next Permutation 求下一个排序@LeetCode
完全没有思路,参考了 http://www.cnblogs.com/etcow/archive/2012/10/02/2710083.html分三步: 1. 从后往前找falling edge,下降沿。(下降之后的那个元素) 2. 从下降沿开始往后找出替换它的元素。(就是第一个比它小的前一个元素) 3. 反转后面所有元素,让他从小到大sorted(因为之前原创 2013-11-21 13:35:40 · 2393 阅读 · 0 评论 -
Palindrome Partitioning 分割字符串为回文@LeetCode
DFS回溯又一经典应用package Level4;import java.util.ArrayList;import java.util.Hashtable;/** * Palindrome Partitioning * * Given a string s, partition s such that every substring of the parti原创 2013-11-22 00:48:19 · 2720 阅读 · 1 评论 -
Gas Station 加油站问题 @LeetCode
两种解法,暴力必须优化才能通过,DP直接通过。传说中的BloomBerg面试题?package Level4;import java.util.Arrays;/** * Gas Station * * There are N gas stations along a circular route, where the amount of gas at * statio原创 2013-11-22 01:39:28 · 5264 阅读 · 0 评论 -
Recover Binary Search Tree BST找乱序的两个元素 @LeetCode
很巧妙的一题,http://yucoding.blogspot.com/2013/03/leetcode-question-75-recover-binary.html 解释的很详细。tricky的地方在于要注意只有两个元素的情况package Level4;import Utility.TreeNode;/** * Recover Binary Search Tree原创 2013-11-22 04:32:00 · 6826 阅读 · 1 评论 -
Spiral Matrix 输出旋转矩阵@LeetCode
又是一道关于旋转矩阵的问题,思路都很固定,但具体写的时候很容易出错package Level4;import java.util.ArrayList;/** * Spiral Matrix * * Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix原创 2013-11-22 06:01:01 · 4051 阅读 · 2 评论 -
Insert Interval 插入区间@LeetCode
动态合并的问题:通过遍历intervals,和newInterval对比:1 如果比newInterval小:直接加入新集合2 如果有overlap,动态改变newInterval为新的区间,继续合并3 如果比newInterval大:加入newInterval到新集合,然后把newInterval更新为当前对象之前在做第三步时,不懂得用动态改变newInterval的原创 2013-11-22 07:46:27 · 2652 阅读 · 0 评论 -
Copy List with Random Pointer 复制有随机指针的链表@LeetCode
1 先画好图2 注意可能形成环的情况,因此必须拆成3个循环来做代码是按照 http://www.cnblogs.com/lautsie/p/3259724.html 的图来写的一个单链表,其中除了next指针外,还有一个random指针,指向链表中的任意某个元素。如何复制这样一个链表呢?通过next来复制一条链是很容易的,问题的难点在于如何恰当地设置新链表中的r原创 2013-11-22 10:34:18 · 6340 阅读 · 0 评论 -
ZigZag Conversion 把一个字符串转为zigzag的表示形式@LeetCode
我发现有一类题目,比如这一道题,都是属于思路好想,但是很容易编程有bug的题目。要特别细心处理corner case。。。package Level3;import java.util.Arrays;/** * ZigZag Conversion * * The string "PAYPALISHIRING" is written in a zigzag patte原创 2013-11-22 12:05:45 · 3944 阅读 · 0 评论 -
Merge Intervals 合并区间@LeetCode
采用的是和Insert Interval一样的思想,只不过最开头要先排序一下,用到了java的Collections.sort(List list, Comparator c)自己实现了一个Comparator的compare方法package Level4;import java.util.ArrayList;import java.util.Collections;im原创 2013-11-22 12:42:36 · 4927 阅读 · 3 评论 -
Binary Tree Maximum Path Sum 二叉树最大路径和 @LeetCode
很有难度的一道题,主要是最大和的可能性很多,不知道如何分情况。关键点1:分析:http://fisherlei.blogspot.com/2013/01/leetcode-binary-tree-maximum-path-sum.htmlFor each node like following, there should be four ways existing for max pa原创 2013-11-23 01:05:35 · 14644 阅读 · 0 评论 -
Divide Two Integers 两数相除@LeetCode
思路清晰,就是二倍法。直接用除数去一个一个加,直到被除数被超过的话,会超时。解决办法每次将被除数增加1倍,同时将count也增加一倍,如果超过了被除数,那么用被除数减去当前和再继续本操作。因为一个很大的数经过对数处理后都能在可接受的大小内。比如Integer.MAX_VALUE 的log后也不过31.另外这道题很恶心的一点是在边界的处理,因为我们知道最大允许的负数的绝对值比最大允许的正原创 2013-11-23 14:27:23 · 4006 阅读 · 1 评论 -
Decode Ways 把字符串解码成数字组合@LeetCode
做这道题还是有很多收获的:1.为了避免麻烦,开数组时可以开大一些,如int[] ways = new int[len+10];2. 这道题实际上是和计算要几步走完台阶的那道题本质是一样的。同样要用动态规划3. 在拆分时,之前我一直在纠结如何处理0的为题,特别是对于输入是01,101,1001这样的数。后来才发现可以用10来判断,而不用对0去判断!具体过程:要求当前的index为原创 2013-11-24 05:05:21 · 3231 阅读 · 1 评论 -
Construct Binary Tree from Preorder and Inorder Traversal 从先序和中序重建二叉树@LeetCode
经典的题目,而且在实际中也有着用途,比如如何把一个二叉树序列化后通过网络传给另一台机器,我们就可以把二叉树以preorder和inorder的方式变成string传给另一台机器,另一台机器再重建二叉树。package Level4;import Utility.TreeNode;/** * * Construct Binary Tree from Preorder and原创 2013-11-24 06:22:51 · 2999 阅读 · 2 评论 -
Construct Binary Tree from Inorder and Postorder Traversal 由中序和后序重建二叉树@LeetCode
同上一题,这一题是由inorder和postorder来确定树,对于postorder,root要从尾部开始找package Level4;import Utility.TreeNode;/** * Construct Binary Tree from Inorder and Postorder Traversal * * Given inorder and原创 2013-11-24 08:46:47 · 1692 阅读 · 0 评论 -
Sudoku Solver 破解数独 @LeetCode 附DFS感想
典型DFS/递归/回溯/深搜题。对于DFS,说白了1) 什么时候返回?在本题中,1.当x>8或y>8 表示已经遍历完所有的格子,因此成功完成,返回true。2.当下一个搜索(子搜索)返回true,说明已经找到,返回true。 3.如果测试过本轮的所有可能解,但无一是对的,说明无解,返回false。 4.如果当前空格不是空格,则改变x,y坐标后,继续下一个空格的尝试2)DFS就是针对本轮原创 2013-11-24 11:00:55 · 4707 阅读 · 6 评论 -
Simplify Path 简化文件路径@LeetCode
用栈来做,先把输入字符串以'/'为分隔符分来,如果遇到'.'或者空输入什么都不做。如果遇到'..'就弹栈。然后每从栈里退出一个元素就用'/'连接起来,注意顺序。发现Java里面的LinkedList实现了栈和队列的所有方法,而且还有重复的!值得注意的是,LinkedList中的pop()对应的是remove()或者removeHead() 即从链表头移除,而不是removeLast(原创 2013-11-24 11:38:22 · 5741 阅读 · 4 评论 -
Reverse Nodes in k-Group k-group翻转链表@LeetCode
这种题目是要背下来的。。翻转单链表:ListNode dummy = new ListNode(0); dummy.next = head; ListNode pre = dummy; ListNode cur = head.next; ListNode last = head; while(cur != null){ las原创 2013-11-24 12:43:13 · 2252 阅读 · 0 评论 -
Merge Two Sorted Lists 合并两个有序链表@LeetCode
之前做过这道题,没有用递归,做的非常痛苦。我就在想这是Level2的题怎么会怎么麻烦。。果然用了递归变得非常简洁!以后优先选择递归的解法(特别是链表和树的题目),如果不行再用迭代!package Level2;import Utility.ListNode;/** * Merge Two Sorted Lists * * Merge two sorted linke原创 2013-11-25 05:12:26 · 2729 阅读 · 0 评论 -
Convert Sorted List to Binary Search Tree 把有序链表转为BST@LeetCode
万能的递归法,注意到有一点比较巧的是,由于单链表都是单向的。所以这里我的查找区间设置为左闭右开!这样就避免了去找mid节点的前一个节点package Level4;import Utility.ListNode;import Utility.TreeNode;/** * Convert Sorted List to Binary Search Tree *原创 2013-11-25 10:27:52 · 5367 阅读 · 1 评论 -
Evaluate Reverse Polish Notation 求RPN的值@LeetCode
用一个Stack就很容易做到了,这道题的最大发现是:这道题是2013-11-27发布出来的,到今天,短短半个月内,居然提交量快到了1万!!!居然有这么多人都在刷题!!压力山大!package Level3;import java.util.Stack;/** * * Evaluate Reverse Polish Notation * * Evaluate t原创 2013-12-15 09:07:28 · 4420 阅读 · 2 评论 -
Partition List 链表划分区间@LeetCode
简单的partition,用两个链表,3个指针。package Level4;import Utility.ListNode;/** * Partition List * * Given a linked list and a value x, partition it such that all nodes less than x come before nodes原创 2013-12-15 11:28:08 · 1375 阅读 · 0 评论 -
Reverse Linked List II 局部翻转链表@LeetCode
局部翻转,要点是:1 利用dummy节点2 记录4个关键位置:翻转区间前的最后一个未翻转节点 preBegin翻转区间,翻转后的第一个节点 reHead翻转区间,翻转后的最后一个节点 reverseEnd翻转区间后的第一个未翻转节点 postEnd3 利用3指针(reHead, preCur, cur)翻转链表package Level4;import原创 2013-12-15 12:23:24 · 1733 阅读 · 0 评论 -
Merge k Sorted Lists 合并k个有序链表@LeetCode
还是基于merge的思想package Level3;import java.util.ArrayList;import Utility.ListNode;/** * Merge k Sorted Lists * Merge k sorted linked lists and return it as one sorted list. Analyze and desc原创 2013-12-15 13:00:04 · 1806 阅读 · 2 评论 -
Unique Binary Search Trees II 输出二叉树的所有组合@LeetCode
总结一点,要求出所有组合的问题,一般用dfs;如果要求总数,用dp。另外,这道题的思路就是对1..n中的每一个数都依次让它做root,然后分出左右区间,再递归求解。最后把左右区间求得的子结果依次分别作为root的左右孩子,因此总共要3次循环。还有值得注意的技巧是,当begin>end时,要往ret AL里面添加null,使得每个AL里面至少有一个元素(null)。这样可以避免判断只有左区间原创 2013-12-16 05:28:40 · 6974 阅读 · 0 评论 -
Distinct Subsequences 在S中找T包含的所有字符的组合数@LeetCode
动态规划。不会做,参考了http://leetcodesolution.blogspot.com/2013/09/distinct-subsequences.htmlhttp://blog.csdn.net/abcbc/article/details/8978146特别是第一篇:Analysis:If S[0] = T[0], then原创 2013-12-16 07:15:27 · 4642 阅读 · 1 评论 -
First Missing Positive 找第一个没在array中出现的正数@LeetCode
这道题可能会有歧义,意思是要找出第一个没在array中出现的正数!核心思想是利用数组下标来作为hash值,通过swap把元素移到应该在的位置,然后遍历数组,找到第一个错位的元素。主要参考了:http://n00tc0d3r.blogspot.com/2013/03/find-first-missing-positive.htmlhttp://www.cnblogs.co原创 2013-12-16 10:15:52 · 2520 阅读 · 0 评论 -
Restore IP Addresses 还原IP地址@LeetCode
DFS算法的练习,现在逐渐对这类题有感觉了!在parseInt时用到的一个小技巧是:int val = Integer.parseInt(s); if(!String.valueOf(val).equals(s)){ // 防止解析成00.01.010.0类似的情况 return false; }package Level3;import j原创 2013-12-16 11:49:24 · 1823 阅读 · 6 评论 -
Median of Two Sorted Arrays 两个有序数组的中位数@LeetCode
超级难的一道题,线性时间复杂度好做,就是merge。但是对数复杂度,就要用到很多数学分析,实际上就是要找到第k小的元素。翻遍了网络,觉得还是这一篇讲的最详细,而且写得代码最容易转为Java,因为Java无法像C++一样把数组名作为指针,进而操作。http://nriverwang.blogspot.com/2013/04/k-th-smallest-element-of-two-sor原创 2013-12-16 13:52:04 · 5371 阅读 · 0 评论 -
Reorder List 链表首尾交叉排列@LeetCode
思路就是:1 用快慢指针找到中间节点2 翻转中间节点后一个元素到最后一个元素区间的所有元素3 断开前半段和翻转后的后半段元素4 把前半段和翻转后的后半段元素以交叉的方式合并起来5 特殊处理输入为空,只有一个元素和只有两个元素的corner case,就是多加几个if...return感想:可以看出翻转链表实在是非常重要,是做很多题目的基础。还有merge的思想也很重原创 2013-12-17 05:30:05 · 2926 阅读 · 1 评论 -
Multiply Strings 两个字符串代表数字相乘@LeetCode
这道题一开始觉得很麻烦,后来参考了http://leetcodenotes.wordpress.com/2013/10/20/leetcode-multiply-strings-%E5%A4%A7%E6%95%B4%E6%95%B0%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2%E4%B9%98%E6%B3%95/comment-page-1/#comment-122原创 2013-12-17 09:28:51 · 14926 阅读 · 0 评论 -
Minimum Window Substring 最小子串窗口@LeetCode
不好做的一道题,参考了许多资料:http://leetcode.com/2010/11/finding-minimum-window-in-s-which.htmlhttp://www.geeksforgeeks.org/find-the-smallest-window-in-a-string-containing-all-characters-of-another-string/原创 2013-12-17 11:27:20 · 3514 阅读 · 0 评论 -
Sort List 链表排序@LeetCode
要求时间为O(nlogn),最适合就是merge sort,每次从n/2处断开,对两段递归sort,然后再merge起来。空间是O(logn)用了栈空间package Level4;import Utility.ListNode;/** * Sort List * * Sort a linked list in O(n log n) time using const原创 2013-12-17 12:04:53 · 1914 阅读 · 2 评论 -
Permutations 排序(有重复数)II @LeetCode
比起http://blog.csdn.net/fightforyourdream/article/details/14217105多加了一个while来去重,发现这个去重方法在另一道题也用过,同样也是DFS里面去重,很好用!另外就是在最前面加了一个sort,因为如果没加,当输入乱序时就会Output Limit Exceed!package Level4;import ja原创 2013-12-20 14:41:26 · 2815 阅读 · 0 评论 -
Text Justification 文本对齐 @LeetCode
快被这道题搞死了。。根据这篇重写了 http://www.cnblogs.com/TenosDoIt/p/3475275.html分析:这一题需要注意两个点,a、当该行只放一个单词时,空格全部在右边 b、最后一行中单词间只有一个空格,其余空格全部在右边。然后只要贪心选择,在一行中尽量放多的单词。package Level4;import java.util.ArrayL原创 2013-12-21 06:14:45 · 4380 阅读 · 0 评论 -
Permutation Sequence 求第k个的排列序列 @LeetCode
思路:1 求出所有的排序,直到k为止。至少Java会超时。2 数学,找规律,不好想! 参考 http://fisherlei.blogspot.com/2013/04/leetcode-permutation-sequence-solution.html假设有n个元素,第K个permutation是a1, a2, a3, ..... ..., an那么a1是哪一个数字呢?原创 2013-12-22 12:31:15 · 7988 阅读 · 2 评论 -
Candy 根据排名分糖果 @LeetCode
一些例子:1 2 3 3 3 =》 8 因为candy数可以是1 2 3 1 11 2 3 2 3 =》9 因为candy数可以是1 2 3 1 2思路:1 d[i] 是给第i个小孩最少几块糖rank[i] > rank[i - 1],必须比前一个多给一块,d[i] = d[i - 1] + 1rank[i] == rank[i原创 2013-12-23 04:56:31 · 5528 阅读 · 0 评论 -
Clone Graph 图的复制 @LeetCode
思路:图的复制,基于BFS,用到了Hashtable来去重参考:图的遍历有两种方式,BFS和DFS这里使用BFS来解本题,BFS需要使用queue来保存neighbors但这里有个问题,在clone一个节点时我们需要clone它的neighbors,而邻居节点有的已经存在,有的未存在,如何进行区分?这里我们使用Map来进行区分,Map的key值为原创 2013-12-23 05:52:36 · 8347 阅读 · 0 评论