leetcode
文章平均质量分 72
yb3232
这个作者很懒,什么都没留下…
展开
-
leetcode--CountCompleteTreeNodes
complete binary tree:最后一层以上的节点全部排满,最后一层叶子节点都在左边。(可能满也可能不满) 如果用前序中序或者后序递归的话,内存过大,时间也不够。因此根据complete binary tree的性质,分别求最左子节点和最右子节点的深度,如果相等就根据公式返回,不等再向下递归。这样可以减少递归的次数。 /** * Created by marsares on 15/原创 2015-06-16 19:50:04 · 275 阅读 · 0 评论 -
leetcode--BalancedBinaryTree
平衡二叉树: 左右子树深度差的绝对值不大于一,且左右子树为平衡二叉树。 /** * Created by marsares on 15/6/12. */ public class BalancedBinaryTree { boolean isBalanced=true; public boolean isBalanced(TreeNode root) { i原创 2015-06-12 09:36:50 · 240 阅读 · 0 评论 -
leetcode--BinaryTreeInorderTraversal
二叉树中序遍历非递归实现: 利用两层循环以及stack,第一层循环代替总的递归过程,第二个循环代替先序遍历时逐层向下访问左节点。第一层循环用stack为空作为控制条件,第二层循环当前节点没有左节点就结束了。 public List inorderTraversal(TreeNode root) { if (root == null) return new ArrayList()原创 2015-06-13 15:17:05 · 206 阅读 · 0 评论 -
leetcode--树的序列化与反序列化
序列化:利用队列,先将根节点放在队列中,然后从队列中poll节点出来在把左子节点和右子节点放入队列中。循环至队列为空。 反序列化:也是使用队列 public TreeNode Unserialize(String s){ if(s==null)return null; if(s.length()==0)return null; Queuequeu原创 2015-06-13 15:10:56 · 660 阅读 · 0 评论 -
leetcode--BinaryTreeLevelOrderTraversal II (二叉树层遍历递归实现)
思路:先层遍历在逆序 层遍历递归实现:利用List每次递归根据层号加入List中对应的List,递归的顺序左节点在右节点之前就可以保证每一层左边的节点比右边的节点先加入List。 import java.util.LinkedList; import java.util.List; /** * Created by marsares on 15/6/13. */ public class原创 2015-06-13 18:16:07 · 295 阅读 · 0 评论 -
leetcode--BinaryTreePreorderTraversal
思路:同InorderTraversal,利用两层while循环,外层代表总的递归,里层while代表不断寻找左子节点的过程,因为是前序遍历,将add操作放在内层while就好了。 import java.util.LinkedList; import java.util.List; import java.util.Stack; /** * Created by marsares on 1原创 2015-06-14 12:29:26 · 196 阅读 · 0 评论 -
leetcode--BinaryTreeMaximumPathSum
思路:在能够遍历所有节点的递归中嵌套对于该节点延伸出的最长路径的计算,然后利用类变量记录下最长路径。由于要计算每个根节点延伸出的最长路径,可以先计算该根节点的左、右节点为起点的最长路径,然后取最长的组合。递归就可以写成计算根节点为起点最长路径的函数,然后递归成左节点为起点,右节点为起点,正好可以遍历所有节点。 /** * Created by marsares on 15/6/14. */原创 2015-06-14 11:20:47 · 272 阅读 · 0 评论 -
leetcode--BinaryTreePostorderTraversal
思路:如果按照后序遍历将节点放入list,什么时候当前节点可以放入list?当左右子节点都为空或者左右子节点都已经放入list的时候,左右子节点都已经放入list又可以分情况讨论进行简化 1右节点为空,左节点放入list 2左节点为空,右节点放入list 3左右节点都放入list 情况三,因为是后序遍历,当右节点放入list时左节点已经放入了list,所以简化成右节点放入list 最后判原创 2015-06-14 17:16:03 · 274 阅读 · 0 评论 -
leetcode--ConvertSortedArraytoBinarySearchTree
思路:取中位数作为当前的根节点,中位数左边的数组递归的计算左子节点,中位数右边的数组递归计算右子节点。 /** * Created by marsares on 15/6/15. */ public class ConvertSortedArraytoBinarySearchTree { public TreeNode sortedArrayToBST(int[] nums) {原创 2015-06-15 20:17:13 · 233 阅读 · 0 评论 -
leetcode--ConstructBinaryTreefromInorderandPostorderTraversal
思路:后序遍历子节点一定在根节点的左边,通过从右往左的遍历可以从根节点到子节点生成二叉树。中序遍历左子节点在根节点的左边,右子节点在根节点的右边。在生成二叉树的时候可以通过中序遍历判断当前节点在二叉树中的位置。 import java.util.HashMap; /** * Created by marsares on 15/6/15. */ public class ConstructB原创 2015-06-15 20:19:55 · 195 阅读 · 0 评论 -
leetcode--ConstructBinaryTreefromInorderandPostorderTraversal
思路:后序遍历前面的节点一定是后面的节点的子节点,因此从后往前遍历可以从根节点向下构造出二叉树。中序遍历左子节点一定在根节点的左边,而右子节点一定在根节点的右边。因此可以通过中序遍历来判断当前节点在树中的位置。 import java.util.HashMap; /** * Created by marsares on 15/6/15. */ public class ConstructB原创 2015-06-15 20:08:48 · 294 阅读 · 0 评论 -
leetcode--WildcardMatching
思路一: 利用递归,当遇到*,进行深搜的递归。 /*boolean isMatch=false; public boolean isMatch(String s, String p) { dfs(s,p); return isMatch; } public void dfs(String s,String p){ if(s原创 2015-08-08 17:17:06 · 242 阅读 · 0 评论 -
leetcode--LinkedListCycleII
思路: 1.从head开始利快慢指针分别向后遍历,快指针每次比慢指针多走一步,直到快指针和慢指针相遇。 2.创建一个新的慢指slow2针指向head,和之前的慢指针同时向后遍历,直到两个慢指针相遇,返回当前相遇的节点。 证明: 设head到达环入口start需要m步,遍历一遍环需要n步。当慢指针slow到达环入口走了m步,快指针fast比slow多走m步,赶上slow需要n-m%n步。当f原创 2015-08-27 16:30:55 · 286 阅读 · 0 评论 -
leetcode--LRU Cache
思路: LRU Cache:当缓存填满的时候,删除最久没使用过的数据。 通过双向链表记录数据的使用情况,当get或者put一个时,将链表中该node移到链表头部。这样链表尾部就是最久没使用过的node。 通过hash map保存key,value使查询时间为O(1),当缓存慢的时候找到链表尾部的node并取出key值,删除map中对应的键值对。 Tips:map使用的泛型可以通过key直接原创 2015-07-21 16:23:06 · 389 阅读 · 0 评论 -
leetcode--PalindromeLinkedList
思路: 为了达到O(N)的时间复杂度和O(1)的空间复杂度,分成三步完成。 1.利用快慢指针找到中间节点 2.从中间节点到尾部反转链表 3.从头和尾向中间遍历,判断是否相等 public boolean isPalindrome(ListNode head) { if(head==null)return true; ListNode mid = findM原创 2015-08-27 10:31:45 · 262 阅读 · 0 评论 -
leetcode--LongestValidParentheses
思路: 遍历s,遇到‘(’入栈,遇到‘)’且栈顶为‘(’将栈顶出栈并计算长度。length=i-stack.peek()这样可以将所有规范的长度计算出来。而遇到‘)’且栈顶不是‘(’说明0-i已经不能再形成规范的字符串,将i入栈,与之后的计算隔离。 public int longestValidParentheses(String s) { Stackstack=new Sta原创 2015-08-18 13:36:31 · 258 阅读 · 0 评论 -
leetcode--LargestRectangleinHistogram
思路: 首先考虑这样一种情况,之前所有的柱都是递增的,最后一个柱子小于之前所有的柱子。 此时求每个柱子对应的最大面积只需要计算与左边相邻柱子的距离以及与最后柱子的距离乘以当前柱子高度,时间复杂度为O(n)。 如何把一般的情况转化成这种特殊的情况呢? 可以遍历柱子,用栈存放递增的柱子下标,一旦遇到小于栈顶的柱子把栈内大于当前柱高的下标全部出栈并计算面积。然后将当前下标入栈。原创 2015-08-17 16:09:50 · 324 阅读 · 0 评论 -
Leetcode--MaximumGap
要在线性时间内完成计算,那么先排序再计算MaximumGap就不合适了。计数排序如果遇到{99999,100000}的话就超过线性时间了,因此这里采用桶排序的方法。 桶排序: A[0,1,...,n]分在m个桶中B1,B2,...,Bm,每个桶代表一个区间B1 时间复杂度为O(n+n/m*log(n/m)*m)=O(n+nlogn-nlogm)当n==m时接近O(n) 这里选取m=原创 2015-06-11 19:40:48 · 305 阅读 · 0 评论 -
leetcode--JumpGame
思路: 贪心算法,利用局部最优解达到全局最优解。在每个节点拓展当前能到达的最远距离,如果当前能到达的最远距离为节点本身说明已经没办法前进了返回false。当前能到达的最远距离大于等于末尾节点则可以到达返回true。/** * Created by marsares on 15/7/1. */ public class JumpGame { public boolean canJump原创 2015-07-01 12:08:39 · 280 阅读 · 0 评论 -
Leetcode--SortColors
为了达到n的空间复杂度,可以使用快排中的partition方法。利用三个指针:start, iterator, last以及一个区分值p这里为1。iterator遍历整个数组,如果遇到1的数则和last交换这样可以将数字分成p三部分。 /** * Created by marsares on 15/6/11. */ public class SortColors { public v原创 2015-06-11 10:00:47 · 247 阅读 · 0 评论 -
leetcode--FlattenBinaryTreetoLinkedList
思路:顺序为前序遍历的顺序 需要注意的地方是需要对初始的root做修改而不是返回新的root。 public void flatten(TreeNode root) 这里传入的root只是指向root的指针,如果root=new TreeNode(val),root就不再指向root了。因此修改初始的root的话,需要修改root的值以及root的子节点,而不是将root指向一个新的节点。原创 2015-06-16 20:03:32 · 217 阅读 · 0 评论 -
leetcode--ValidateBinarySearchTree
思路:在递归参数中加入左区间和右区间,当递归左子节点时更新右区间,当递归右子节点时更新左区间。 可以简单地证明一下,如果左子节点要符合BST要求,首先得符合当前节点的区间范围,然后要小于当前节点。因此更新右区间。 /** * Created by marsares on 15/6/17. */ public class ValidateBinarySearchTree { bool原创 2015-06-17 20:26:54 · 290 阅读 · 0 评论 -
leetcode--UniqueBinarySearchTreesII
思路:利用递归的思想,要返回(1,n)之间的所有BST可以遍历1->n,root作为根节点,然后将(1->root-1)返回的所有节点作为左子节点以及(root+1,n)返回的所有节点作为右子节点拼接在root下,所有这些root放入数组返回。 import java.util.ArrayList; import java.util.LinkedList; import java.util.Li原创 2015-06-18 18:49:48 · 259 阅读 · 0 评论 -
leetcode--RecoverBinarySearchTree
思路:BST中序遍历生成从小到大的排序数组,如果交换两个节点,相当于交换了数组中的两个数字。我们只要找出中序遍历中不符合排序顺序的两个数字即可。可以利用指针pre记录前一个节点,当后节点小于前节点时有问题。注意当交换的是相邻的两个数字时只能找到一个节点是大于前节点的。 /** * Created by marsares on 15/6/19. */ public class RecoverB原创 2015-06-19 18:23:10 · 249 阅读 · 0 评论 -
leetcode--NumberofIslands
思路: 从第一行往下对每个'1'分别对右和下相邻为'1'的元素做union操作,最后每个'1'都和上下左右四个相邻的元素做了union,union and find count数即为island数。 union and find: 有几种实现,时间复杂度取决于find()以及union()函数,find()返回该节点属于哪个集合,union把两个节点对应的两个集合进行归并。 这里采用最优的原创 2015-06-21 21:13:23 · 208 阅读 · 0 评论 -
leetcode--ConvertSortedListtoBinarySearchTree
思路:如果用数组可以直接取到中间值,因此可以用前序遍历的顺序来构建BST。但是链表如果要取中间值需要n/2的时间,因此采用中序遍历的顺序来构建BST。 这样root生成的顺序就和中序遍历的顺序一样,也就是list从前往后的顺序。 import java.util.List; /** * Created by marsares on 15/6/23. */ public class Conv原创 2015-06-23 10:14:01 · 246 阅读 · 0 评论 -
Leetcode--Median of Two Sorted Array
这是我做的第一道hard的题,因为看到时间限制为O(log(m+n)),所以想到了要用divide and conquer。但是如何进行divide却没有很好的思路,想到了两个方案,一个是每次去掉小于第m+n/2的数,最后剩下的就是m+n/2。但是如何确定边界条件没有想好。第二个方案是每次去掉相同数量的小于m+n/2和大于m+n/2的数,转化成更小的两个数组。 最后看了http://blog原创 2015-06-04 15:26:19 · 304 阅读 · 0 评论 -
Leetcode--LongestSubString
查找最长的没重复字母的子串: 思路是通过hashmap以及两个指针,第二个指针不断读入新的字母并把未重复的字母索引存入hashmap。当遇到重复字母,第二个指针移动到hashmap中的索引位置后面,并更新子串长度。 /** * Created by marsares on 15/6/2. */ public class LongestSubstring { int[]ht=ne原创 2015-06-04 16:07:53 · 246 阅读 · 0 评论 -
leetcode--CourseScheduleII
思路: 先判断有没有环,再进行拓扑排序。 import java.util.ArrayList; import java.util.List; import java.util.Stack; /** * Created by marsares on 15/6/24. */ public class CourseScheduleII { List[]adj; boolean原创 2015-06-27 21:18:08 · 363 阅读 · 0 评论 -
Leetcode--LongestPalindromicString
两种思路: 第一种:将问题转化成求s和s逆串的最长连续公共子序列 最长连续公共子序列是在求最长公共子序列基础上增加了连续子序列的限定。先看下最长公共子序列: 假设A="a0,a1,...,am-1", B="b0,b1,...,bn-1", Z="z0,z1,...,zk-1"是A,B的最长公共子序列。 当am-1=bn-1可以分解成一个子问题求”a0,a1,...,am-2"以及"b0,原创 2015-06-06 15:08:15 · 234 阅读 · 0 评论 -
Leetcode--RegularExpressionMatching
可以把问题简化成如下的递归形式 d[i][j]表示String s[0...i]与Pattern p[0...j]是否匹配 case1:p[j+1]!='*', 比较s[i]与p[j]。if(s[i]==p[j])d[i][j]=d[i-1][j-1] else return false。如果p[j]==‘.’,那么作相等处理 case2:p[j+1]=='*',依次调用d[i][j-1],原创 2015-06-08 19:40:13 · 243 阅读 · 0 评论 -
leetcode--SurroundedRegions
思路:利用bfs先把所有和最外层O连通的O标记,然后遍历所有点,没被标记的O就是被X包围的内层点 import java.util.LinkedList; import java.util.Queue; /** * Created by marsares on 15/6/28. */ public class SurroundedRegions { boolean[][]marke原创 2015-06-28 10:50:12 · 260 阅读 · 0 评论 -
leetcode--ImplementstrStr
思路: 利用kmp算法 /** * Created by marsares on 15/6/29. */ public class ImplementstrStr { public int strStr(String haystack, String needle) { int[]next=getNext(needle); int i=0;原创 2015-06-29 23:29:26 · 255 阅读 · 0 评论 -
leetcode--WordLadderII
思路一: 先用bfs遍历最短路径并记录每个节点的前序节点,后用dfs从end开始回溯到start生成所有的路径。 HashMap hm=new HashMap(); int[]len; List[]list; List>lists=new ArrayList>(); LinkedListpath=new LinkedList(); String star原创 2015-06-29 23:31:53 · 233 阅读 · 0 评论 -
leetcode--SortList
因为需要时间复杂度为O(nlogn)所以考虑使用归并排序。ListNode不同于数组,因此要重写合并的方法和找中点的方法。这边找中点使用两个指针,一个快,一个慢。当慢指针到达链表尾端时,快指针到达链表中间。 /** * Created by marsares on 15/6/9. */ public class SortList { public ListNode sortList(原创 2015-06-09 18:22:59 · 186 阅读 · 0 评论 -
leetcode--JumpGame
思路: 贪心算法,利用局部最优解达到全局最优解。在每个节点拓展能达到的最远距离,如果当前节点能达到的最远距离等于当前节点那么就无法继续前进,返回false。如果当前节点能达到的最远距离大于等于末尾节点那么返回true。 /** * Created by marsares on 15/7/1. */ public class JumpGame { public boolean can原创 2015-07-01 13:10:06 · 222 阅读 · 0 评论 -
leetcode--Palindrome Partitioning
思路: 首先想到用深度优先,每次递归传入之前的路径链表,以及剩下的字符串。对剩下的字符串再次划分成两部分part1、part2,先判断part1是否回文然后将part1放入路径链表,和part2一起传入再次递归。 /*List> lists = new ArrayList>(); public List> partition(String s) { if (s ==原创 2015-08-06 16:07:59 · 229 阅读 · 0 评论