摘要: 原题地址先把链表分割成前后两半,然后交叉融合实践证明,凡是链表相关的题目,都应该当成工程类题目做,局部变量、功能函数什么的随便整,代码长了没关系,关键是清楚,不容易出错。代码: 1 ListNode *reverseList(ListNode *head) { 2 if (!head) retu... 阅读全文
posted @ 2015-01-28 21:23 李舜阳 阅读(178) 评论(0) 推荐(0)
摘要: 原题地址如果不存在重复元素,仅通过判断数组的首尾元素即可判断数组是否连续,但是有重复元素的话就不行了,最坏情况下所有元素都一样,此时只能通过线性扫描确定是否连续。设对于规模为n的问题的工作量为T(n),则有T(n) = T(n/2) + O(n),根据主定理,可以求得T(n) = O(n)。和之前的... 阅读全文
posted @ 2015-01-28 19:55 李舜阳 阅读(124) 评论(0) 推荐(0)
摘要: 原题地址简单模拟题。从先向后遍历,如果重复出现2次以上,就不移动,否则移动到前面去代码: 1 int removeDuplicates(int A[], int n) { 2 if (n == 0) return n; 3 4 int len = 1... 阅读全文
posted @ 2015-01-28 17:05 李舜阳 阅读(138) 评论(0) 推荐(0)
摘要: 原题地址依次枚举起始点,DFS+回溯代码: 1 bool dfs(vector > &board, int r, int c, string word) { 2 int m = board.size(); 3 int n = board[0].size(); 4 int dir[4][2... 阅读全文
posted @ 2015-01-28 16:55 李舜阳 阅读(253) 评论(0) 推荐(0)
摘要: 原题地址有两种方法:1. 对于序列S,其子集可以对应为一个二进制数,每一位对应集合中的某个数字,0代表不选,1代表选,比如S={1,2,3},则子集合就是3bit的所有二进制数。所以,照着二进制位去构造解空间即可。2. 也可以用DFS做,对于每个元素,要么选,要么不选。记得先排序,因为结果集的数字要... 阅读全文
posted @ 2015-01-28 16:26 李舜阳 阅读(178) 评论(0) 推荐(0)
摘要: 原题地址生成字典序,交换 + 逆序生成字典序的方法:1. 从后向前,寻找第一个正序对,即num[i] &num) { 2 int i = num.size() - 2; 3 while (i >= 0 && num[i] >= num[i + 1]) 4 ... 阅读全文
posted @ 2015-01-28 15:49 李舜阳 阅读(525) 评论(0) 推荐(0)
摘要: 原题地址w指针遍历数组,如果w跨过b,则退出若w指向的元素是白色,指针右移若w指向的元素是红色,交换w和r指向的元素若w指向的元素是蓝色,交换w和b指向的元素代码: 1 void sortColors(int A[], int n) { 2 int r = 0; 3 int w = 0; 4... 阅读全文
posted @ 2015-01-28 15:30 李舜阳 阅读(172) 评论(0) 推荐(0)
摘要: 原题地址二分搜索变种先按行搜索,然后按列搜索代码: 1 bool searchMatrix(vector > &matrix, int target) { 2 if (matrix.empty() || matrix[0].empty()) return false; 3 4 int m ... 阅读全文
posted @ 2015-01-28 15:10 李舜阳 阅读(155) 评论(0) 推荐(0)
摘要: 原题地址用矩形的第一行和第一列充当mask代码: 1 void setZeroes(vector > &matrix) { 2 if (matrix.empty() || matrix[0].empty()) return; 3 4 bool fir... 阅读全文
posted @ 2015-01-28 14:54 李舜阳 阅读(136) 评论(0) 推荐(0)
摘要: 原题地址二分搜索变种代码: 1 vector searchRange(int A[], int n, int target) { 2 vector range(2, -1); 3 int l, r; 4 5 // left 6 ... 阅读全文
posted @ 2015-01-28 14:43 李舜阳 阅读(141) 评论(0) 推荐(0)
摘要: 原题地址经典的链表题目。1. 用双指针法判断是否有环2. 将一个指针重置为链表首部,另一个指针保留在之前重合的位置,两个指针同时移动,相遇位置即为环出现的位置2的证明:设链表头节点是A,环出现位置为B,快慢指针最终相遇位置为C,如下图所示设环的周长为p,则有:1. 快指针所走的路径长度为 L_fas... 阅读全文
posted @ 2015-01-28 14:25 李舜阳 阅读(222) 评论(0) 推荐(0)
摘要: 原题地址小心溢出。检测乘法溢出的方法:设乘数为A、B,乘积为C,检验C / A =? B,前提是B != 0检测加法溢出的方法:检验A + B <? 0代码: 1 int sqrt(int x) { 2 int l = 0; 3 int r = x; 4 5 while (l <= r... 阅读全文
posted @ 2015-01-28 13:55 李舜阳 阅读(131) 评论(0) 推荐(0)
摘要: 原题地址二分搜索变种,注意到当左指针和右指针相交后,应该插入的位置总是在左指针处,所以直接返回左指针即可。代码: 1 int searchInsert(int A[], int n, int target) { 2 int l = 0; 3 int r = n - 1... 阅读全文
posted @ 2015-01-28 12:16 李舜阳 阅读(108) 评论(0) 推荐(0)
摘要: 原题地址经典链表题目,快慢指针法。曾经是面试热门题目之一,现在有些过时了。代码: 1 bool hasCycle(ListNode *head) { 2 ListNode *fast = head; 3 ListNode *slow = head; 4 ... 阅读全文
posted @ 2015-01-28 12:08 李舜阳 阅读(131) 评论(0) 推荐(0)
摘要: 原题地址最朴素的想法就是,枚举容器的左边界和右边界,总能找到解,不过时间复杂度是O(n^2)的。改进I:从左向右枚举左边界,在此基础上从右向左枚举右边界,一旦右边界高度>=左边界高度就可以停止枚举了,因为继续枚举下去找到的矩形肯定面积更小。比如下图,左边界在位置0,高度为height[0]=3,那么... 阅读全文
posted @ 2015-01-28 11:52 李舜阳 阅读(188) 评论(0) 推荐(0)
摘要: 原题地址与Word Break II(参见这篇文章)相比,只需要判断是否可行,不需要构造解,简单一些。依然是动态规划。代码: 1 bool wordBreak(string s, unordered_set &dict) { 2 int maxLen = 0; 3 f... 阅读全文
posted @ 2015-01-28 11:01 李舜阳 阅读(146) 评论(0) 推荐(0)