摘要: 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 阿牧遥 阅读(327) 评论(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 阿牧遥 阅读(198) 评论(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 阿牧遥 阅读(187) 评论(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 阿牧遥 阅读(187) 评论(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 阿牧遥 阅读(192) 评论(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 阿牧遥 阅读(166) 评论(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 阿牧遥 阅读(346) 评论(0) 推荐(0)