随笔分类 -  leetcode

摘要:思路很简单,因为只有两个节点互换了,只需要找到这两个节点,再换回来即可 可是怎么找到这两个节点呢? 方法一 直接中序遍历得到一个数组arr1,然后新建一个数组arr2,copy arr1,将其排序 对比arr1和arr2,很容易就能找到不同的两个节点,互换即可 时间复杂度为o(nlogn) 方法二 阅读全文
posted @ 2019-08-19 03:20 南山南北秋悲 阅读(179) 评论(0) 推荐(0)
摘要:可以用bfs,先序中序后序4种解法 我觉得bfs比较好写,所以就用了bfs 阅读全文
posted @ 2019-08-19 01:42 南山南北秋悲 阅读(161) 评论(0) 推荐(0)
摘要:中序遍历,计数器数到k时,输出当前节点值 阅读全文
posted @ 2019-08-18 10:14 南山南北秋悲 阅读(117) 评论(0) 推荐(0)
摘要:class BSTIterator { private Stack stack; public BSTIterator(TreeNode root) { stack = new Stack(); while(root != null){ stack.push(root); root = root... 阅读全文
posted @ 2019-08-18 09:03 南山南北秋悲 阅读(84) 评论(0) 推荐(0)
摘要:其实就是一个二分搜索 首先遍历LinkedList,记下链表长度 然后从mid开始, mid.left = 左部的mid mid.right = 右部的mid 依次递归,因为这相当于一个中序遍历,调用栈的最底层是从LinkedList首个元素开始的 阅读全文
posted @ 2019-08-18 08:06 南山南北秋悲 阅读(181) 评论(0) 推荐(0)
摘要:其实就是一个二分搜索 mid为当前root, 然后分别用左右两个部分完成左右子树的构建 阅读全文
posted @ 2019-08-16 02:01 南山南北秋悲 阅读(128) 评论(0) 推荐(0)
摘要:看看什么是最低共同祖先,就是第一个左右分别存在p和q的节点 还是正常dfs,当遇到null返回null,遇到p返回p,遇到q返回q 若left 和 right 都不为null则说明这就是我们要找的节点 阅读全文
posted @ 2019-08-16 01:58 南山南北秋悲 阅读(100) 评论(0) 推荐(0)
摘要:最低共同祖先,肯定值处于两者之间,而且是第一个这样的节点 所以就像二分搜索一样,当前节点值都大于p和q,则向左走,反之向右走 当碰到介于两者之间时,说明当前节点就是我们要找的 阅读全文
posted @ 2019-08-16 01:49 南山南北秋悲 阅读(131) 评论(0) 推荐(0)
摘要:按题意检查即可 可以递归,会比较好理解,逐渐收缩max和min 也可以迭代,利用中序遍历 阅读全文
posted @ 2019-08-16 01:43 南山南北秋悲 阅读(149) 评论(0) 推荐(0)
摘要:不就是bfs,然后返回每层最后一个节点值吗 阅读全文
posted @ 2019-08-16 01:32 南山南北秋悲 阅读(125) 评论(0) 推荐(0)
摘要:利用双向队列 偶数层当栈用, 奇数层当队列用 阅读全文
posted @ 2019-08-16 01:30 南山南北秋悲 阅读(124) 评论(0) 推荐(0)
摘要:正常做bfs,然后List添加的时候,从头部开始添加add(0, ...) 阅读全文
posted @ 2019-08-16 01:25 南山南北秋悲 阅读(121) 评论(0) 推荐(0)
摘要:先看递归的解法 无非就是取recur(root) + recur(root孙子节点)… 和 recur(root.left) + recur(root.right)的最大值 但是递归会反复求解之前求过的值,比如求recur(root.left)时又会重新求一遍recur(root孙子节点) 这个时候 阅读全文
posted @ 2019-08-16 01:20 南山南北秋悲 阅读(134) 评论(0) 推荐(0)
摘要:常规思路就是走一遍dfs找出叶子节点,记录,删除叶子节点,反复直到树空,时间复杂度为o(n!) 但是,我们可以通过记录当前节点到叶子节点的距离,来完成题目要求,只需要一遍dfs,时间复杂度为o(n) 阅读全文
posted @ 2019-08-16 01:07 南山南北秋悲 阅读(166) 评论(0) 推荐(0)
摘要:思路很简单,存在最优子结构,用递归自上至下解即可。 如何判断当前root所代表的树是否为uni-value subtree? 1. 检查root和left,right值是否一致 2. left子树和right子树是否都为uni-value 注意第二步,可能left,right为空,写if时要注意 阅读全文
posted @ 2019-08-16 00:43 南山南北秋悲 阅读(338) 评论(0) 推荐(0)
摘要:lc132 Palindrome Pairs 2 大致与lc131相同,这里要求的是最小分割方案 同样可以分割成子问题 dp[i][j]还是表示s(i~j)是否为palindrome res[i]则用来记录s(0~i)的最小cut数 阅读全文
posted @ 2019-06-21 15:59 南山南北秋悲 阅读(132) 评论(0) 推荐(0)
摘要:lc131 Palindrome Pairs 解法1: 递归 观察题目,要求,将原字符串拆成若干子串,且这些子串本身都为Palindrome 那么挑选cut的位置就很有意思,后一次cut可以建立在前一次cut的基础上 举例来说 "aab" 第一次cut"a" "ab" 第二次cut"a" "b" 很 阅读全文
posted @ 2019-06-21 14:16 南山南北秋悲 阅读(176) 评论(0) 推荐(0)
摘要:lc 336 Palindrome Pairs 最简单的就是每两个都拼接一下,然后判断是否为回文串 时间复杂度为o(n^2*k) n:words个数 k:word平均长度 但是我们仔细观察一下,两个word拼接之后,是如何判断是否为回文串的呢?首尾指针,匹配,向中间收缩。 假如现在有一个单词"asa 阅读全文
posted @ 2019-06-21 10:33 南山南北秋悲 阅读(229) 评论(0) 推荐(0)
摘要:lc214 Shortest Palindrome 可以将问题转化成找到原字符串的最长palindrome子串(注意,子串必须以s[0]为起始) 例如:sdserf sds为最长palindrome子串 只需要将sds之后的子串翻转一下,补充到原字符串之前即可 fre + sdserf 那么如何找到 阅读全文
posted @ 2019-06-17 22:05 南山南北秋悲 阅读(176) 评论(0) 推荐(0)
摘要:lc9 Palindrome Number 题目要求在不将原int转换为string的情况下,判断该int是否为P.N. 思路很简单,从后向前,依次取个位十位、、、上的数作为最高位,次高位 怎么取? 先%10,然后/10为下次做准备 怎么放到预定位置? sum += sum*10 + 上一个问题中% 阅读全文
posted @ 2019-06-17 09:47 南山南北秋悲 阅读(138) 评论(0) 推荐(0)