09 2013 档案

摘要:这道题是DP。那么一开始很自然的想出了O(n^3)的方法。就是预处理是否是Palindrome的boolean[][],话费O(n^3)。然后处理i到j段件的cut数目int[][]也花O(n^3)时间,因为i和j两层循环,中间又要遍历一次i和j之间的分割点。但是网上看了一下两者都可以化简到O(n^2)。前者也是个DP,因为valid[i][j]依赖于valid[i+1][j-1]和s[i]==s[j]。而后面其实多求了许多不需要的信息,我们只要cut[0][j]就行了,而这里把所有的cut[i][j]都求了。这有点像Floyd算法求了所有点之间最短距离,所以复杂度就比Dijkstra高了一维 阅读全文
posted @ 2013-09-30 22:15 阿牧遥 阅读(179) 评论(0) 推荐(0)
摘要:http://wikioi.com/problem/1169/棋盘型的动态规划,这道题可以看成是从左上角向右下角走两条不重合的路(除了开始和结尾)。动态规划要想的是状态和阶段,状态是(x1,y1,x2,y2),两个分别一步一步走,所以阶段就是L=x+y。这样状态也能简化成三维(L, x1, x2)。约束是其中每一部两个棋子不能重合(如果重合就设为0)。状态转移是每一步都可以从之前的四个状态走过来,比较取最大值就行。如果用循环的方式写,则L从小到大,x1,x2也从小到大循环。这里用了备忘录方式写,就比较方便。#include #include #include using namespace s 阅读全文
posted @ 2013-09-30 21:00 阿牧遥 阅读(212) 评论(0) 推荐(0)
摘要:思路,思路,还是思路。拿到这道题目的时候,习惯性的用DP去想,想不出,然后想分治,然后想到搜索(遍历),觉得效率太低。但其实看了题解之后,这种求全部解的,用遍历如DFS是很自然的。相比之下,之后的Palindrome PartitioningII那个题目,DP显然更自然。当理解到是DFS时,这道题忽... 阅读全文
posted @ 2013-09-30 13:51 阿牧遥 阅读(237) 评论(0) 推荐(0)
摘要:这道题有点难。(首先这题是重新创建一个新的BST,所以就不用去想怎么在原有的list里面指针颠来倒去了。)1.首先这道题如果O(n*logn)就很简单了。如果可以O(n)空间的话,转化成数组,就可以O(n)时间,但这就没意思了。所以答案是可以O(1)空间,O(n)时间的。2.看过答案知道是自底向上考虑。但试了一下,生成的子树的节点个数先是少的,然后变多,然后又少(一开始1个节点的左子树,然后生成3个节点的子树时,又要生成1个节点的右子树),用循环写很不好表示状态,需要用栈来记住很多东西。3.那么看到很多相似的步骤,就可以用递归来做,但这是个自底向上的递归,怎么做呢?看一下答案,发现有这么些规律 阅读全文
posted @ 2013-09-30 01:47 阿牧遥 阅读(413) 评论(0) 推荐(0)
摘要:http://community.topcoder.com/stat?c=problem_statement&pm=10750&rd=14153http://apps.topcoder.com/wiki/display/tc/SRM+470因为是棋盘型,然后就想到棋盘型DP;觉得不行,就想到BFS/DFS(这时其实已经把这个看成一张图了)。发现,寻找下一个节点进来的时候,总是要全局考虑所有已经Activate的点,BFS/DFS未果。此时感觉有点像最小生成树的Prim算法,用贪心的,但不知如何证明。此时看了一下题解,发现果然可以规约成最小生成树。因为本质是把棋盘看成一棵树后,整 阅读全文
posted @ 2013-09-28 12:00 阿牧遥 阅读(337) 评论(0) 推荐(0)
摘要:http://community.topcoder.com/stat?c=problem_statement&pm=11225&rd=14427http://apps.topcoder.com/wiki/display/tc/SRM+498此题的暴力解法是一个BFS。BFS的话,要有Queue,如果是图的话,还要有Set来记录走过的状态。后面答案中会看到其实可以用贪心,就是只要输入和输出的各种颜色数量一样,就一定能变换过来,这个下回再表。import java.util.*;public class NinePuzzle{ public int getMinimumCost(S 阅读全文
posted @ 2013-09-28 02:37 阿牧遥 阅读(318) 评论(0) 推荐(0)
摘要:http://community.topcoder.com/stat?c=problem_statement&pm=10172&rd=13515http://community.topcoder.com/tc?module=Static&d1=match_editorials&d2=srm424这道题目是和最小生成树有关。记得最小生成树的一个算法(容易实现的那个),Kruskal,要用到并查集。想想就是以边为主,那么才可能形成多个边的集合,然后再合并。并查集的n次合并查找的复杂度是o(n)。TopCoder的思想似乎主要是快速实现解决问题,对复杂度的要求一般,所 阅读全文
posted @ 2013-09-26 23:15 阿牧遥 阅读(231) 评论(0) 推荐(0)
摘要:http://community.topcoder.com/stat?c=problem_statement&pm=7753&rd=10672http://community.topcoder.com/tc?module=Static&d1=match_editorials&d2=srm348这道题看着就是DP,但怎么DP呢?一开始按照测试例子{1,3,2,6,4,5}和答案{1,2,4,5}, {1,3,4,5}, {1,2,6} and {1,3,6}产生了错觉,以为必须要以该点结尾的最长子序列。写完之后比照正确答案调试许久,发现不对。{4,2,1,3,5} 阅读全文
posted @ 2013-09-26 00:35 阿牧遥 阅读(248) 评论(0) 推荐(0)
摘要:有意思的题目,同样的代码,小数据,Java是600+ms,而C++就6ms。所以大数据Java超时。估计递归一多,Java的效率明显下降。1. 思路是从外圈往里做标记,标记活下来的cell;2. 因为螺旋打印很熟了,所以就螺旋的从外面往里面标记;3. 但是发现了一个问题,错误的标记了第三行第四个为'... 阅读全文
posted @ 2013-09-25 21:53 阿牧遥 阅读(391) 评论(0) 推荐(0)
摘要:http://community.topcoder.com/stat?c=problem_statement&pm=11609&rd=14547http://apps.topcoder.com/wiki/display/tc/SRM+522这道题学到的:1.如果要搜索或遍历,至少要知道边界,这里用了1*1==1找到了边界;然后的优化是遍历A的可能性时,B只要在c/A左右找就行了。如果整除了,当然是这种情况的最小,-1和1用来mitigate不整除的情况。如果B再偏多一些,比如1,那么C就会偏出A,abs肯定会更大。import java.math.*;public class 阅读全文
posted @ 2013-09-25 11:43 阿牧遥 阅读(298) 评论(0) 推荐(0)
摘要:现在觉得有空时可以刷一下topcoder的DIV 2的Lvl 3的题目。感觉和刷LeetCode和WikiOi都是不一样的。http://community.topcoder.com/stat?c=problem_statement&pm=11552&rd=14544http://apps.topcoder.com/wiki/display/tc/SRM+519这道题目是找规律,从6变到8的过程中有最大的15;而由35到38的过程中最大是39,主要是去掉32后,3->6的过程中有个4,所以变成32+7。所以算法就是找到最高的那个不同的位,然后把后面的都变成1就行了。但实现 阅读全文
posted @ 2013-09-25 00:15 阿牧遥 阅读(246) 评论(0) 推荐(0)
摘要:似曾相识。。。public class Solution { public int[][] generateMatrix(int n) { int cnt = 1; int top = 0; int bottom = n-1; int left = 0; int right = n-1; int[][] r = new int[n][n]; while (cnt = left; i--) r[bottom][i] = cnt++; bott... 阅读全文
posted @ 2013-09-24 21:37 阿牧遥 阅读(170) 评论(0) 推荐(0)
摘要:http://wikioi.com/problem/1044/这道题是DP。前一问很自然可以规约成最长不升(含等号下降)子序列。难点在后一问为何能规约成最长上升子序列。后来看了网上的回答,仍然没有简单的理解方法,似乎需要证明。证明可以这么来看,一是如果有长度为n的上升子序列,那么至少要n个序列;二,可以找一个方法构造出这n个队列。(方法暂不表)但如果用贪心,就好理解多了。比如:389 207 155 300 299 170 158 65 贪心就是从头往后,只要能放入第一个队列就第一个,那么389,207,155,然后跳过一些放入65然后第二个队列开始300。最终是300,299,170,158 阅读全文
posted @ 2013-09-24 20:30 阿牧遥 阅读(227) 评论(0) 推荐(0)
摘要:难题。一开始使用递归+备忘录的方式,我的递归写的太烂,大数据集合超时。要注意的是,一开始没考虑到"", "*"的case。超时的代码(即使后来加上长度的预先判断):class Solution {public: int matrix[1000][1000]; bool isMatch(c... 阅读全文
posted @ 2013-09-23 22:13 阿牧遥 阅读(2114) 评论(0) 推荐(1)
摘要:使用了HashMap和排序,此题就没啥了。在长度一定范围的情况下,用26*的方式做key会更好。注意两点:1. java的遍历是for和: 2. map.keySet()public class Solution { public ArrayList anagrams(String[] str... 阅读全文
posted @ 2013-09-22 20:05 阿牧遥 阅读(245) 评论(0) 推荐(1)
摘要:这种题目有了正确的方法就能简单很多。这道题目是先做对角线的交换,然后上下交换。要注意的是,如果对角线交换,等号两边的i和j肯定是交换的(m[i][j]和m[j][i])public class Solution { public void rotate(int[][] matrix) { int len = matrix.length; for (int i = 0; i < len; i++) { for (int j = 0; j < len-i; j++) { int... 阅读全文
posted @ 2013-09-22 19:09 阿牧遥 阅读(230) 评论(0) 推荐(1)
摘要:一致性哈希环形Hash解决节点的增删问题,虚拟节点解决平衡性问题。http://blog.csdn.net/kongqz/article/details/6695417http://www.jiacheo.org/blog/174http://blog.csdn.net/sparkliang/article/details/5279393(虚拟节点)C10K问题编写连接数巨大的高负载服务器程序时,经典的多线程模式和select模式都不再适用。 应当抛弃它们,采用epoll/kqueue/dev_poll来捕获I/O事件。最后简要介绍了AIO。 epoll:(1) LT水平触发 (2) ET边缘 阅读全文
posted @ 2013-09-21 23:27 阿牧遥 阅读(614) 评论(0) 推荐(0)
摘要:有了前几题的经验,这道题也很快过了。有序添加,每一次DFS都是找解中的第i个元素。public class Solution { ArrayList> ans = new ArrayList>(); ArrayList tmp = new ArrayList(); public ArrayList> combinationSum2(int[] candidates, int target) { ans.clear(); tmp.clear(); Arrays.sort(candidates); boolean used[... 阅读全文
posted @ 2013-09-21 23:18 阿牧遥 阅读(183) 评论(0) 推荐(0)
摘要:有了之前的经验,此题相对顺利。public class Solution { ArrayList> ans = new ArrayList>(); ArrayList tmp = new ArrayList(); public ArrayList> combinationSum(int[] candidates, int target) { ans.clear(); tmp.clear(); sub(candidates, 0, 0, target); return ans; } private vo... 阅读全文
posted @ 2013-09-21 23:08 阿牧遥 阅读(186) 评论(0) 推荐(0)
摘要:要完成这道题,首先让我们再回顾一下SubSet IIhttp://discuss.leetcode.com/questions/265/subsets-ii1.每次进入sub的时候,都会记录当前path为一个结果(一个子集);2.进入sub时,是用i个元素的子集来推导i+1个元素的子集的过程;3.有了i个元素,第i+1个元素只从原始集合S的位置i之后的元素选;4.该算法的关键是,有序添加。保证,产生的集合中的元素是有序的。比如[1,2,3,4,5](暂不考虑重复)如果进入sub的时候是[1,3],那么下一步是[1,3,4]和[1,3,5]为什么没有[1,3,2]呢,因为[1,2]比如在[1,3 阅读全文
posted @ 2013-09-21 11:57 阿牧遥 阅读(720) 评论(0) 推荐(0)
摘要:DFS的遍历。里面的关键是两个:1.使用了合理的数据结构,用ArrayList来存每一段;2.后来发现一个条件是,除了‘0’以外不能有以‘0’开头的段;我看有的人判断比255小是先转化为数字再判断,比我这个字符串的简单。public class Solution { ArrayList result = new ArrayList(); ArrayList section = new ArrayList(); public ArrayList restoreIpAddresses(String s) { result.clear(); sectio... 阅读全文
posted @ 2013-09-20 21:20 阿牧遥 阅读(243) 评论(0) 推荐(0)
摘要:高精度大数相乘。首先是用数组存大数,然后关键的是ans[i+j] += num1[i]*num2[j]。数组中的数这时可能会大于10,就扫一遍做进位处理。编写中犯过的两个错:1.ans[i+j] += num1[i]*num2[j]没有写+;2.略过末尾的0时,忘记判断index>=0;3.如果结果... 阅读全文
posted @ 2013-09-20 20:52 阿牧遥 阅读(309) 评论(0) 推荐(0)
摘要:http://wikioi.com/problem/1017/划分型动态规划1.转移方程是:f[i][j]=max(f[k][j-1]*t[k+1][i]),f[i][j]表示前面i个字符加上j个乘号所得的最大值,t[i][j]表示i到j的数值;2.可预处理,先计算出每段的数字值;3.看代码分析错误实在不行时,还是debug一下吧。#include #include #define ulong long longusing namespace std;ulong t[45][45]; // number from i to j; start from 0;ulong f[45][10]; // 阅读全文
posted @ 2013-09-20 12:18 阿牧遥 阅读(169) 评论(0) 推荐(0)
摘要:棋盘型动态规划。(PPT:http://wenku.baidu.com/view/56badad850e2524de5187ea3.html)该类动态规划有一个共性,那就是在一个矩阵中(一般是二维矩阵,当然可能有更加复杂的图形)给出一些规则,然后按规则去做某些决策,我们思考这类问题的基本方法是:以坐标为状态,坐标之间的转换关系,一般利用问题给出的规则进行决策转移。状态转移方程一般可描述如下: F(i,j)=Max{f(i-1,k)}+决策;这里k为规则数此题简单。唯一的处理是用(不会重复的)整数来记录二维的点。还有差点忘记了C++中的数组定义是int mx[25][25]这样的了。多语言使用的 阅读全文
posted @ 2013-09-19 19:03 阿牧遥 阅读(326) 评论(0) 推荐(0)
摘要:http://wikioi.com/problem/1048/区间型动态规划。参考PPT:http://wenku.baidu.com/view/73c1ded5b9f3f90f76c61bc4.html首先对于这样的动态规划,我现在的经验是可以有两种思路一是从k到k+1,二是分左右两段,此题就是分左右两段。在PPT中的题目,是一个环(或者圈),最后又有一个优化,就是把n个的环变成2*n个的Array,这样就把复杂度保持在O(n^3)。当然本题是非环,更简单一点。在PPT的总结里也写到:该类问题的基本特征是能将问题分解成为两两合并的形式。解决方法是对整个问题设最优值,枚举合并点,将问题分解成为 阅读全文
posted @ 2013-09-19 16:51 阿牧遥 阅读(271) 评论(0) 推荐(0)
摘要:http://wikioi.com/problem/1576/经典的动态规划。我写了个o(n^2)的DP方法。PPT:http://wenku.baidu.com/view/bd290294dd88d0d233d46ac7.html线型动态规划问题,最典型的特征就是状态都在一条线上,并且位置固定,问题一般都规定只能从前往后取状态,解决的办法是根据前面的状态特征,选取最优状态作为决策进行转移。设前i个点的最优值,研究前i-1个点与前i个点的最优值,利用第i个点决策转移,如下图。状态转移方程一般可写成: fi(k) = min{ fi-1 or j( k’) + u(i,j) or u(i,i.. 阅读全文
posted @ 2013-09-18 15:04 阿牧遥 阅读(623) 评论(0) 推荐(0)
摘要:简单题。public class Solution { public ArrayList getRow(int rowIndex) { ArrayList ans = new ArrayList(); ans.add(1); ArrayList tmp = new ArrayList(); for (int i = 1; i <=rowIndex; i++) { for (int j = 0; j <= i; j++) { if (j == 0 ... 阅读全文
posted @ 2013-09-18 13:52 阿牧遥 阅读(158) 评论(0) 推荐(0)
摘要:简单题,但也思考了一会。就是pos标志下一个要写入的位置,而current标志下一个可以写入的内容。public class Solution { public int removeDuplicates(int[] A) { if (A.length == 0 || A.length == 1) return A.length; int pos = 0; int current = 0; boolean encounted = false; while (current < A.length) { if (current == 0 || A[curre... 阅读全文
posted @ 2013-09-17 22:08 阿牧遥 阅读(159) 评论(0) 推荐(0)
摘要:简单题。public class Solution { public ListNode deleteDuplicates(ListNode head) { if (head == null) return null; if (head.next == null) return head; ListNode last = head; ListNode current = head.next; while (current != null) { if (last.val == curre... 阅读全文
posted @ 2013-09-17 21:51 阿牧遥 阅读(146) 评论(0) 推荐(0)
摘要:树的BFS的简单变种。public class Solution { public ArrayList> zigzagLevelOrder(TreeNode root) { ArrayList> ans = new ArrayList>(); if (root == null) return ans; Queue queue = new LinkedList(); queue.offer(root); int lastLevel = 1; int thisLevel = 0; boolean... 阅读全文
posted @ 2013-09-17 21:36 阿牧遥 阅读(172) 评论(0) 推荐(0)
摘要:三维DP,用备忘录方式写很简单。但是正如那天讨论时说的那样,使用备忘录法,可能会对复杂度和递推公式理解不够深刻。这道题目的递推公式很简单,但是复杂度的话。。。因为数组里的值每个都被计算仅为一次,所以应该是O(n^3)要注意的是,最后一维的是len+1public class Solution { public boolean isScramble(String s1, String s2) { char[] ca1 = s1.toCharArray(); char[] ca2 = s2.toCharArray(); if (s1.length()... 阅读全文
posted @ 2013-09-16 23:01 阿牧遥 阅读(258) 评论(0) 推荐(0)
摘要:简单递归。public class Solution { public TreeNode sortedArrayToBST(int[] num) { return partialConvert(num, 0, num.length-1); } private TreeNode partialConvert(int[] num, int left, int right) { if (left > right) return null; if (left == right) { retur... 阅读全文
posted @ 2013-09-14 11:53 阿牧遥 阅读(155) 评论(0) 推荐(0)
摘要:对这种树的操作,已经比较熟练了。class Solution {public: int sumNumbers(TreeNode *root) { int sum = 0; calculate(root, 0, sum); return sum; } void calculate(TreeNode *root, int currentSum, int& sum) { if (root == NULL) return; currentSum = currentSum * 10 + root->va... 阅读全文
posted @ 2013-09-11 23:44 阿牧遥 阅读(140) 评论(0) 推荐(0)
摘要:这道题目一看就去翻答案了,因为以前见过,知道并查集可以用来做分组,但这样的题目真的要并查集么?想想也是HashSet之类就能搞定么。果然是HashMap而不是HashSet。下面这个解法我比较容易理解,刚开始乍看发现对每一个n又要左边遍历右边遍历的,仔细一看对每一段遍历过的数字就标记一下,那么保证每个数字只访问一次,还是O(n)。public class Solution { public int longestConsecutive(int[] num) { HashMap map = new HashMap(); int max = 0; f... 阅读全文
posted @ 2013-09-11 23:13 阿牧遥 阅读(262) 评论(0) 推荐(0)
摘要:有一道链表的题目。今天面试别人出了链表的题目都被答出来了,可见这个一般训练过还是能做出来的,就是考虑corner case即可。这里主要是m为1的时候,head就要变了。class Solution {public: ListNode *reverseBetween(ListNode *head, int m, int n) { ListNode* current = head; ListNode* last = NULL; int i = 1; while (i != m && current != NULL) { ... 阅读全文
posted @ 2013-09-11 22:37 阿牧遥 阅读(170) 评论(0) 推荐(0)
摘要:此题是DP,有了Edit Distance(http://www.cnblogs.com/lautsie/p/3251311.html)的经验,照理说是能想出来的,但我把字符串分两份后就开始想左边的数目乘以右边的数目,这思路是不对的,是分治的思路,而这种DP的话,是多了一个后,用之前的一两个的状态来计算。所以状态转移方程式dp[i][j]=dp[i-1][j] (s[i-1] != t[j-1]时)或dp[i][j] = dp[i-1][j-1]+dp[i-1][j] (s[i-1]==t[j-1]时)。其中dp[i][j]表示S和T长度为i和j时的Distinct SubSequences。 阅读全文
posted @ 2013-09-09 22:40 阿牧遥 阅读(243) 评论(0) 推荐(0)
摘要:不要忘记在最后append进位的1,如果有的话;一开始用while写的很快,忘记了i++,死循环了;a+b的情况下,忘记了-'0'两次;还有是要a.charAt(lenA-i-1),一开始用a.charAt(i)了,脑子一乱忘记了0是最左边的;public class Solution { public String addBinary(String a, String b) { int carrior = 0; ArrayList list = new ArrayList(); int lenA = a.length(); int lenB ... 阅读全文
posted @ 2013-09-09 14:05 阿牧遥 阅读(215) 评论(0) 推荐(0)
摘要:用递归就比较简单。class Solution {public: ListNode *reverseKGroup(ListNode *head, int k) { ListNode* current = head; ListNode** nodeArray = new ListNode*[k]; int i = 0; while (current != NULL && i next; i++; } if (i 0; j--) { nodeArra... 阅读全文
posted @ 2013-09-08 23:32 阿牧遥 阅读(239) 评论(0) 推荐(0)
摘要:LeetCode抽风,用Java会runtime error就用c++来写。思路是简单的,写法参考了答案。用了root和pivot两个辅助头结点,就可以免去对是否为NULL的判断。还有要对尾节点的next设为NULL。class Solution {public: ListNode *partition(ListNode *head, int x) { ListNode* root = new ListNode(-1); ListNode* pivot = new ListNode(-1); ListNode* root_last = root;... 阅读全文
posted @ 2013-09-08 23:12 阿牧遥 阅读(310) 评论(0) 推荐(1)
摘要:捡个软柿子捏一捏,结果也有不少小坑。1.n可能会比length大(或相等),所以要先%一下;2. 是向右rotate而不是向左,所以先n=len-npublic class Solution { public ListNode rotateRight(ListNode head, int n) { if (head == null) return null; int len = 0; ListNode node = head; while (node != null) { node = node.... 阅读全文
posted @ 2013-09-03 17:07 阿牧遥 阅读(190) 评论(0) 推荐(0)
摘要:双指针,简单题,顺手就写出来了。public class Solution { public int removeElement(int[] A, int elem) { int i = 0; int j = 0; int len = A.length; while (j < len) { if (A[j] == elem) { j++; } else { ... 阅读全文
posted @ 2013-09-03 16:43 阿牧遥 阅读(159) 评论(0) 推荐(0)
摘要:犯了两个错误,一个是node为null时,仍然把left和right往queue里放,空指针错误。一个是到最后一层,节点的left和right都是null,那么新建的ArrayList就是空,不该往结果里放。此题DFS也可,就是把层次传进去:http://discuss.leetcode.com/questions/275/binary-tree-level-order-traversal-iipublic class Solution { public ArrayList> levelOrderBottom(TreeNode root) { ArrayList> ans ... 阅读全文
posted @ 2013-09-03 16:36 阿牧遥 阅读(188) 评论(0) 推荐(0)
摘要:这道题目由于之前那题的训练,思路来的很快,但写的时候脑子浆糊了。这个时候就要高屋建瓴的去思考,把其中一段循环什么啊提炼成一个函数出来,那么主要那一块的逻辑就简单了。public class Solution { public void connect(TreeLinkNode root) { if (root != null) root.next = null; TreeLinkNode first = root; TreeLinkNode last = null; while (first != null) { ... 阅读全文
posted @ 2013-09-03 16:01 阿牧遥 阅读(289) 评论(0) 推荐(0)
摘要:简单的递归。命名上用了inLow, inHigh这样的觉得比较好。public class Solution { public TreeNode buildTree(int[] inorder, int[] postorder) { if (inorder.length != postorder.length) return null; return buildTree(inorder, 0, inorder.length-1, postorder, 0, postorder.length-1); } private TreeNode bu... 阅读全文
posted @ 2013-09-03 15:21 阿牧遥 阅读(200) 评论(0) 推荐(0)
摘要:用递归比较方便。public class Solution { public TreeNode buildTree(int[] preorder, int[] inorder) { if (preorder.length != inorder.length) return null; return buildTree(preorder, 0, preorder.length, inorder, 0, inorder.length); } private TreeNode buildTree(in... 阅读全文
posted @ 2013-09-03 14:58 阿牧遥 阅读(216) 评论(0) 推荐(0)