摘要:
思想: 动态规划,分析:
12121212: 前面为1 或者 (前面是2 且 当前值 1。 阅读全文
2014年8月27日 #
摘要:
思想:因为 A 很大, 所以从最大值开始插入, 即从 A 的 m+n 位置开始插入数据。避免了冗余的移动。
思想:
1. 由于要 O(1) 时间确定某 key 是不是在 Cache 中,所以用 Hash_map (), 从而能够O(1)找到结点地址,返回对应的 value。
2. 由于要 O(1) 时间插入、删除某项, 所以各项之间的存储不能用单链表(删除时要O(n)查找前面的结点),不能用顺序表(插入、删除都 O(n)), 故存储使用双链表。
综上分析,查找、插入、删除都是 O(1)时间。(代码尚可优化) 阅读全文
摘要:
思想: 顺序读,取前面的每个子集,把该位置数放后面作为新的子集。
思想: 排序后,按照 1 的方法。但是若前面的数字与本数字相同,则只读取含有前面数字的每个子集,把自身放在后面作为一个新的子集。 阅读全文
摘要:
思路: f(n) = Σi=1n f(n-i)*f(i-1), 其中 f(0) = f(1) = 1; 利用动归记下之前的 f(2)~f(n-1)即可。
思路:分别以 1~n 为根节点,左右子树根的集合数量相乘,递归,依次得出结果。 阅读全文
摘要:
思想: 动态规划。
DP[i][j] = (DP[i-1][j] && s1[i-1] == s3[i+j-1]) || (DP[i][j-1] && s2[j-1] == s3[i+j-1]); 其中,i, j 分别为字符串 s1, s2 的当前长度。
方法二: 进一步优化,空间复杂度, O(min(s1.size(), s2.size())); 阅读全文
摘要:
思想: Morris traversal.
Solution 1 : Preorder traversal
Solution 2: Inorder traversal.
Solution 3: Morris Traversal. 阅读全文
摘要:
思想: 构造其镜像树。 阅读全文
摘要:
思路: 使用两个队列(一个可以顺序读,所以用vector模拟),每个队列放一层结点。
题解: 两种方法: 1. 使用栈: O(n) Time, O(n) Space。 2. Morris traversal (构造线索树), O(n) Time, O(1) Space. 阅读全文
摘要:
思想: 迭代。
说明: 这类问题,要求一个提供根节点,然后另一个序列(中序序列)可依据根节点分出左右子树。 阅读全文
摘要:
思想: 若递归,传入层号。若迭代,使用队列,在每层结束时,加入一个标记。
思想: 目前用两种方法:1 同上,最后将结果反转一下。 2.先求出最大层数,再层序遍历。(也许还有更好的方法) 阅读全文
摘要:
思想: 以中间点为根节点,按先序顺序来创建 。 阅读全文
摘要:
思想:先序遍历。注意的是: 当只有一个孩子结点时,深度是此孩子结点深度加 1 .
思想: 先序遍历。既要返回左右子树判断的结果,又要返回左右子树的深度进行再判断。
所以要么返回一个 pair, 要么函数参数增加一个引用来传递返回值。 阅读全文
摘要:
思想: 先序遍历。若当前结点为空,返回 false; 不为空,则加上其值,若为叶子结点,则判断一次。
注意: 非路径和, 而是到叶子结点的路径和。例如: {1, 2} 1 返回: false
思路同上: 只是要记下路径。 阅读全文
摘要:
思想: 如 Hints. 阅读全文
摘要:
思想:动态规划。 D[i][j] = D[i][j-1] + (T[i-1] == S[j-1] ? D[i-1][j-1] : 0);
改进后:空间复杂度 O(T.size()). 阅读全文
摘要:
思想: 常量空间要求,决定了不能使用递归。满二叉树,简单循环,每次修改一层即可。
思想同上: 但是下一层最开始结点和连接过程中链表的第一个结点不易确定,所以需要设定两个变量来保存。 阅读全文
摘要:
思想: 简单动态规划。 阅读全文
摘要:
注意: 限制条件: 先买后卖(不同天)。
思想: 买了后,1. 若以后价格不变,不买不卖。 1. 更价格低,重新买。2. 价格升高,假定抛售,更新一下利润值。
思想:求出所有非递减序列两端绝对值之和。我贴在 leedcode 的代码和证明:
思想:动态规划。 记录下从各位置(含)开始之前的最大利润和此时开始到最后的最大利润。 阅读全文
摘要:
思想: 后序遍历。注意路径的连通: 结点不为空时要返回 max( max(leftV, rightV)+rootV, rootV); 阅读全文
摘要:
思想:简单的从两端来逐个读字符,判断是否相等。(36ms) 阅读全文