01 2014 档案

摘要:分布式领域CAP理论,Consistency(一致性), 数据一致更新,所有数据变动都是同步的Availability(可用性), 好的响应性能Partition tolerance(分区容错性) 可靠性定理:任何分布式系统只可同时满足二点,没法三者兼顾。忠告:架构师不要将精力浪费在如何设计能满足三者的完美分布式系统,而是应该进行取舍。关系数据库的ACID模型拥有 高一致性 + 可用性 很难进行分区:Atomicity原子性:一个事务中所有操作都必须全部完成,要么全部不完成。Consistency一致性. 在事务开始或结束时,数据库应该在一致状态。Isolation隔离层. 事务将假定只有它自 阅读全文
posted @ 2014-01-27 20:48 阿牧遥 阅读(266) 评论(0) 推荐(0)
摘要:这个题和leetcode的基本一样。用了更好点的思路。在A中折半猜是不是中位数,A中没有后在B中猜。最后猜到B[j]int median(vector &A) { int n = A.size(); if (n % 2 == 1) { return A[n/2]; } else { return (A[n/2-1] + A[n/2]) / 2; }}int median(vector &A, vector &B, int l, int r) { if (l > r) return median(B, A, 0, B.size()-1);... 阅读全文
posted @ 2014-01-22 23:28 阿牧遥 阅读(261) 评论(0) 推荐(0)
摘要:http://www.itint5.com/oj/#49这一题一开始想到是用HashSet+链表来做,链表记录prev和next。这样也可以,后来看到都是连续的整数,而且交流了一下觉得可以用类似并查集的方式来做,一个数组,每个位置记录该位置的直接后继,删除元素时更改后继。vector vec;void init(int N) { vec.resize(N); for (int i = 0; i = vec.size()) return; vec[x] = query(x+1);}int query(int x) { if (x >= vec.size()) return... 阅读全文
posted @ 2014-01-22 18:46 阿牧遥 阅读(281) 评论(0) 推荐(0)
摘要:http://www.itint5.com/oj/#47一种做法是:把矩形所占的方格都设为-1,就是个最大子矩阵和问题。复杂度o(w^2*h)或o(w*h^2),空间W*H猜想应用场景是:电脑屏幕上已经有了n个聊天框,新建一个聊天框,放在屏幕的哪个位置最好。客户端计算的话,空间复杂度太高的算法应该是没法实际应用的。这种方法OJ也会空间超出。另一种做法(贪心思想,和一个矩形覆盖最小):所求矩形的上边要么贴着边界,要么贴着某个已有矩形的下边所求矩形的下边要么贴着边界,要么贴着某个已有矩形的上边所求矩形的左边要么贴着边界,要么贴着某个已有矩形的右边所求矩形的右边要么贴着边界,要么贴着某个已有矩形的左 阅读全文
posted @ 2014-01-22 15:08 阿牧遥 阅读(293) 评论(0) 推荐(0)
摘要:http://www.itint5.com/oj/#39最大子矩阵和,复杂度O(n^3)。利用了最大子段和的方法。int maxRectSum(vector > &matrix) { int n = matrix.size(); if (n == 0) return 0; int m = matrix[0].size(); if (m == 0) return 0; int max = 0; for (int i = 0; i vec(n); for (int j = i; j max) max = sum; } ... 阅读全文
posted @ 2014-01-22 11:57 阿牧遥 阅读(229) 评论(0) 推荐(0)
摘要:先按照一维排序,然后在第二维求最大上升子序列。注意比较的时候还要考虑第一维虽然排序,还是有可能相等的。bool comp(const Box &a, const Box &b) { if (a.vol != b.vol) { return a.vol &boxes) { sort(boxes.begin(), boxes.end(), comp); int size = boxes.size(); int max = 0; vector dp(size); for (int i = 0; i dp[i]) dp[i] = dp[j]; ... 阅读全文
posted @ 2014-01-21 22:41 阿牧遥 阅读(234) 评论(0) 推荐(0)
摘要:http://www.itint5.com/oj/#28这题有意思。一开始还想不清楚,看了解释,很棒。这个题目的特殊之处是所有节点的值都是不一样的. 所以递归过程可以大大简化. 先看两种遍历的性质:pre-order: root, left *************, right #########post-order: **************left, ########right, root所以 pre-order 的第一个元素一定等于 post-order 的最后一个元素. 然后在post-order中由前往后找, 找出等于pre-oder中第二个元素的位置, 也就是 left 的 阅读全文
posted @ 2014-01-21 21:58 阿牧遥 阅读(265) 评论(0) 推荐(0)
摘要:http://www.itint5.com/oj/#27用了基于stack的中序遍历,记录一下last,就很简单了。#include /*树结点的定义(请不要在代码中定义该结构)struct TreeNode { TreeNode *left, *right; bool isLeftThread, isRightThread;}*/void convertToThreadedTree(TreeNode *root) { stack stak; TreeNode *n = root; TreeNode *last = NULL; while (n != NULL ||... 阅读全文
posted @ 2014-01-21 21:21 阿牧遥 阅读(263) 评论(0) 推荐(0)
摘要:http://www.itint5.com/oj/#25这题在leetcode上是用中序遍历来做的,但是这里由于有相等的情况,即左子树小于等于根,这样中序遍历无法完全判定。可以用递归来做,用递归给出每个子树的上下界。#include bool isBSTRecur(TreeNode *root, int leftVal, int rightVal) { if (root == NULL) return true; return (root->val val > leftVal) && isBSTRecur(root->left, leftVal, root-& 阅读全文
posted @ 2014-01-20 23:22 阿牧遥 阅读(414) 评论(0) 推荐(0)
摘要:http://www.itint5.com/oj/#23这里就是26进制的转换,但是要注意没有0,A就是1,Z就是26。所以要想象成从0开始,才能用原来的方法计算。//将十进制数转换为excel数string decToExcel(int decNum) { string ans; while (decNum != 0) { char c = (char) ((decNum - 1) % 26 + 'A'); decNum = (decNum - 1) / 26; ans += c; } int len = ans.length... 阅读全文
posted @ 2014-01-20 22:50 阿牧遥 阅读(191) 评论(0) 推荐(0)
摘要:http://www.itint5.com/oj/#22这题一开始直接用暴力的DFS来做,果然到25的规模就挂了.vector visited(50, false);vector > vec_row(50);vector > vec_col(50);bool findPath(vector &x, vector &y, int idx, int depth, int direction) { if (depth == x.size()) return true; visited[idx] = true; if (direction == 0) { int row.. 阅读全文
posted @ 2014-01-20 22:24 阿牧遥 阅读(460) 评论(0) 推荐(0)
摘要:http://www.itint5.com/oj/#18这一题,首先如果直接去算的话,很容易就超出int或者long的表示范围了。那么要利用%的性质,(num * 10 + 1) % a = 10 * (num % a) + 1 % a。除了a为1的情况,都是10 * (num % a) + 1。然后计算的时候,先去掉是2和5的倍数的情况。也可以直接做,如果余数出现过,就不用继续了。int findMinAllOne(int a) { if (a % 2 == 0 || a % 5 == 0) return -1; if (a == 1) return 1; int num ... 阅读全文
posted @ 2014-01-20 20:33 阿牧遥 阅读(218) 评论(0) 推荐(0)
摘要:http://www.itint5.com/oj/#15用hash来做,目前为止做到最好也是case16超时(20w的规模),即使分桶也超时。注意计算hashcode时,'a'要算成1,否则如果'a'为0,那么"aa"和"a"是一样的。下面是超时的代码:#define BUCKET 65535#define ulong long longvector > uset(BUCKET);vector pow26(11);ulong hashcode(char *str, int n) { ulong code = 0; f 阅读全文
posted @ 2014-01-20 18:35 阿牧遥 阅读(301) 评论(0) 推荐(0)
摘要:http://www.itint5.com/oj/#12首先由跳马问题一,就是普通的日字型跳法,那么在无限棋盘上,任何点都是可达的。证法是先推出可以由(0,0)到(0,1),那么由对称型等可知任何点都可以到了。加强版是可以跳到(p,q),当然对称的也可以跳到(q,p)。那么接下来是数学推导:http://www.itint5.com/discuss/16/%E8%B7%B3%E9%A9%AC%E9%97%AE%E9%A2%98%E5%8A%A0%E5%BC%BA%E7%89%881. 计算dx=x-x2,dy=y-y2。2. 求出p,q的最大公约数g,如果dx或者dy不能被g整除,那么很显然无 阅读全文
posted @ 2014-01-20 15:15 阿牧遥 阅读(537) 评论(0) 推荐(0)
摘要:http://www.itint5.com/oj/#42基本上就是word ladder。直接来BFS,记录前驱。vector transform(set &dict, string from, string to) { vector ans; if (from.length() != to.length()) { return ans; } queue que; map prev_map; que.push(from); prev_map[from] = ""; while (!que.empty()) { stri... 阅读全文
posted @ 2014-01-20 00:01 阿牧遥 阅读(194) 评论(0) 推荐(0)
摘要:http://www.itint5.com/oj/#17DP。注意曾经把赋值写成了==,结果出错半天。bool isInterleaving(string &str1, string &str2, string &str3) { int n = str1.length(); int m = str2.length(); int k = str3.length(); if (n + m != k) return false; vector > dp(n+1); for (int i = 0; i < n+1; i++) { dp[i].resiz... 阅读全文
posted @ 2014-01-19 23:25 阿牧遥 阅读(328) 评论(0) 推荐(0)
摘要:http://www.itint5.com/oj/#36此题在数据大些,而且全是A的情况下会超时(因为要匹配到很后面才false)。通过利用数组本身作为visited标示,而且使用string引用,得意通过。bool find(vector > &grid, string &pattern, int i, int j, int k) { if (k == pattern.length()) return true; int m = grid.size(); int n = grid[0].size(); if (i = m || j = n) return false;. 阅读全文
posted @ 2014-01-19 22:46 阿牧遥 阅读(200) 评论(0) 推荐(0)
摘要:http://www.itint5.com/oj/#13要注意,一是空路径也可以,所以最小是0。然后要时刻注意路径顶多有两条子路径+根节点组成,所以更新全局最值时和返回上一级的值要注意分清。#include using namespace std;int maxPathHelper(TreeNode *root, int &max) { if (root == NULL) { return 0; } int root_val = root->val; // root it self int max1 = 0; int max2 = 0; for... 阅读全文
posted @ 2014-01-19 17:14 阿牧遥 阅读(260) 评论(0) 推荐(0)
摘要:要注意dp[0][0]要初始化为1。int totalPath(vector > &blocked) { int m = blocked.size(); if (m == 0) return 0; int n = blocked[0].size(); if (n == 0) return 0; vector > dp(m); for (int i = 0; i = 0) dp[i][j] += dp[i-1][j]; if (j-1 >= 0) dp[i][j] += dp[i][j-1]; } ... 阅读全文
posted @ 2014-01-19 16:43 阿牧遥 阅读(188) 评论(0) 推荐(0)
摘要:这一题也简单,唯一有意思的地方是提炼了一个函数用来做数组索引去重前进。int forward(vector &arr, int i) { while (i+1 arrayUnion(vector &a, vector &b) { vector ans; int i = 0; int j = 0; while (i arrayIntersect(vector &a, vector &b) { vector ans; int i = 0; int j = 0; while (i < a.size() && j < b.size() 阅读全文
posted @ 2014-01-19 15:48 阿牧遥 阅读(188) 评论(0) 推荐(0)
摘要:http://www.itint5.com/oj/#20其实是3sum的变种,有重复数字,但是一开始还是写错了。其实是选定一个后,在右边剩余数组里找2sum,找到一组后继续找。#include using namespace std;typedef tuple ABC; //存放a,b,c三元组//返回所有满足条件的(a,b,c)三元组vector threeSumZero(vector &arr) { vector ans; sort(arr.begin(), arr.end()); int k = 0; while (k = 0 && arr[j-1] == arr 阅读全文
posted @ 2014-01-19 15:35 阿牧遥 阅读(195) 评论(0) 推荐(0)
摘要:http://www.itint5.com/oj/#6首先,试验的时候要拿5个来试,3,4个都太少了。好久没做所以方法也忘了,是先从后往前找到第一个不合顺序的,然后在后面找到比这个大的最小的来交换,再把后面排序。#include #include #include using namespace std;bool next_permutation(vector &arr) { bool has_next = false; int size = arr.size(); int i = arr.size() - 1; while (i - 1 >= 0) { ... 阅读全文
posted @ 2014-01-19 14:04 阿牧遥 阅读(168) 评论(0) 推荐(0)
摘要:merge sort,leet code里面曾经做过。但一开始没这么写,遍历来做,效率n*k了,用了merge sort后,变成logn*k。用了dummy node。同时要注意size为0的情况。#include /*链表结点的定义(请不要在代码中定义该类型)struct ListNode { int val; ListNode *next;};*///lists包含k个链表的头结点,返回合并后链表头结点ListNode* merge(vector &lists) { if (lists.size() == 0) return NULL; int k = 1; whil... 阅读全文
posted @ 2014-01-19 12:02 阿牧遥 阅读(347) 评论(0) 推荐(0)
摘要:http://www.itint5.com/oj/#10拓扑排序。首先按照题目给出的数据结构复杂度不会是O(v+e)的,所以先要变换数据结构。二来写的时候用一个stack会更好点。还有就是题目里其实ID就是1到n。#include #include #include #include using namespace std;typedef int JobID;/* * deps[id]表示任务id所依赖的任务 * 如果存在合法的任务完成序列,返回true,否则返回false * 合法的任务序列请存放在参数result中(已经分配空间,不需要push_back) */ /* id are ... 阅读全文
posted @ 2014-01-18 12:52 阿牧遥 阅读(313) 评论(0) 推荐(0)
摘要:http://www.itint5.com/oj/#9一开始有了个n*n的算法,就是把原来的数组*2,由环形的展开成数组。然后调用n次最大子段和的方法。超时。后来看到个O(n)的算法,就是如果不跨越末尾,就是最大字段和;如果跨越末尾,就是sum-(最小子段和)http://blog.csdn.net/hackbuteer1/article/details/6694193int maxConsSum2(const vector &arr) { if (arr.size() == 0) return 0; int dp = 0; int max1 = 0; for (int... 阅读全文
posted @ 2014-01-16 21:59 阿牧遥 阅读(518) 评论(0) 推荐(0)
摘要:http://www.itint5.com/oj/#14要记录原来的索引,所以用了额外的空间,新生成一个结构。如果要省空间,可以用指针来排序,最后拿指针减去索引0的位置就是index,见:http://www.itint5.com/discuss/172/%E4%B8%BA%E5%95%A5%E6%88%91%E8%BF%99%E9%A2%98%E5%9C%A8%E5%A4%A7%E6%95%B0%E6%8D%AE%E6%97%B6%E4%BC%9Asegmentation-fault这里没有用指针,也有很多错误,足可见面试时不要自取其辱,寻找合理的方法即可。一要注意,sort和comp函数, 阅读全文
posted @ 2014-01-16 17:44 阿牧遥 阅读(275) 评论(0) 推荐(0)
摘要:http://www.itint5.com/oj/#4这题是利用完全二叉树的性质计算节点数目。那么是通过比较左右子树的最左结点的高度来看那边是满的,然后递归计算。//使用getLeftChildNode(TreeNode)获得左儿子结点//使用getRightChildNode(TreeNode)获得右儿子结点//使用isNullNode(TreeNode)判断结点是否为空int get_left_height(TreeNode root) { if (isNullNode(root)) { return 0; } else { return get_l... 阅读全文
posted @ 2014-01-16 00:02 阿牧遥 阅读(399) 评论(0) 推荐(0)
摘要:merge sort,记了长度。如果断开链表时把第一个链表的最后一个节点的next设为NULL,就不用在函数参数里传长度了。一直错误是因为在生成的链表最后的next没有设成NULL。用了dummy node很有用。可以借鉴http://blog.csdn.net/sunbaigui/article/details/16843419最后直接把剩余的链表接过来。class Solution {public: ListNode *sortList(ListNode *head) { int size = 0; ListNode *node = head; ... 阅读全文
posted @ 2014-01-15 23:06 阿牧遥 阅读(229) 评论(0) 推荐(0)
摘要:unordered_map mp;if (mp.find(key) == mp.end())unordered_map::iterator it = mp.find(deltmp->key);mp.erase(it);mp.clear();map[k]++ // this includes the case when count of k from 0 to 1for (unordered_map::iterator it = mp.begin(); it != mp.end(); it++) { int result = num_stack.top();num_stack.pop(); 阅读全文
posted @ 2014-01-09 19:47 阿牧遥 阅读(294) 评论(0) 推荐(0)
摘要:逆波兰表达式,情况不是很复杂,用一个栈就解决了。 #include <stack> #include <string> using namespace std; class Solution { public: int evalRPN(vector<string> &tokens) { for (i 阅读全文
posted @ 2014-01-09 15:28 阿牧遥 阅读(273) 评论(0) 推荐(0)
摘要:双链表+map 实现。所有数据存在链表里,map里存key到Node*的映射。注意当删除时除了要从链表尾部删除节点外,还要map.erase(it)。Node里也要有key,因为为了删除时方便找到it。 #include <map> using namespace std; class Node { 阅读全文
posted @ 2014-01-09 13:37 阿牧遥 阅读(190) 评论(0) 推荐(0)