lintcode
文章平均质量分 62
muguangzhilian
这个作者很懒,什么都没留下…
展开
-
Maximum Subarray Difference
该题的思路是使用辅助数组来保存从前向后和从后向前到当前位置的最大最小值,这样就可以通过每一个位置处的最大最小值来计算该位置的结果,最后在所有结果中选出最大的值即可。 int maxDiffSubArrays(vector nums) { // write your code here int size = nums.size(); /原创 2015-07-31 17:26:34 · 888 阅读 · 0 评论 -
最长连续序列
问题: 给定一个未排序的整数数组,找出最长连续序列的长度。解题思路: 该题初始的思路是排序,但是题目有O(n)时间复杂度的要求,所以不能进行排序。可以用空间换时间来解决,也即首先对所有元素进行 hash,这样查找某个元素的时间复杂度就为O(1),然后在求包含待查元素的连续序列的长度的时候只需查找其左右元素是否在hash 表中即可。为了避免元素的重复查找,创建原创 2015-09-06 11:21:19 · 630 阅读 · 0 评论 -
带最小值操作的栈
问题:实现一个带有取最小值min方法的栈,min方法将返回当前栈中的最小值。你实现的栈将支持push,pop 和min 操作,所有操作要求都在O(1)时间内完成。解法:该题的解法是设置一个用于存储当前最小元素的辅助栈。class MinStack {public: MinStack() { // do initialization if neces原创 2015-09-06 09:50:35 · 1232 阅读 · 1 评论 -
数字三角形
问题: 给定一个数字三角形,找到从顶部到底部的最小路径和。每一步可以移动到下面一行的相邻数字上。解题思路: 该题是一道典型的动态规划的题目,到 i 行, j 列元素的最小的路径为 f[i][j],则f[i][j] = min(f[i - 1][j - 1], f[i - 1][j]) + d[i][j],其中 d[i][j]为 i 行,j 列元素的值。i原创 2015-09-05 19:28:31 · 471 阅读 · 0 评论 -
编辑距离
问题:给出两个单词word1和word2,计算出将word1 转换为word2的最少操作次数。 你总共三种操作方法: 插入一个字符 删除一个字符 替换一个字符解题思路: 典型的动态规划问题,用 dp[i][j] 表示 word1 和 word2 中以 i,j 结尾的子串的编辑距离, 如果 word1[i] =原创 2015-09-05 20:22:02 · 546 阅读 · 0 评论 -
数字组合
题目: 给出一组候选数字(C)和目标数字(T),找到C中所有的组合,使找出的数字和为T。C中的数字可以无限制重复被选取。 例如,给出候选数组[2,3,6,7]和目标数字7,所求的解为:[7],[2,2,3]解法: 该题为典型的深搜类型的题目,代码如下 void execFind(vector> &result, vect原创 2015-09-02 13:50:22 · 716 阅读 · 0 评论 -
带重复元素的排列
问题: 给出一个具有重复数字的列表,找出列表所有不同的排列。解题思路: 这里求全排列用的方法是每一位依次与其之后的各个位替换,递归实现。为了避免有重复元素导致的元素重复的问题,只需满足在每一位替换的元素值不发生重复即可。 void execFind(vector> &result, vector cur, vector &nums, int inde原创 2015-09-02 17:13:45 · 1328 阅读 · 0 评论 -
二叉树的序列化和反序列化
该题首先用先序遍历的思路把树转换(序列化)为字符串,这样在恢复的时候就可以根据字符串先序遍历的特点进行恢复(反序列化)。 string int2str(int intsrc){ stringstream ss; ss << intsrc; return ss.str(); }//序列化代码,先序遍历的顺序进行序列化原创 2015-09-01 20:56:28 · 648 阅读 · 0 评论 -
组合(一)
问题: 给出两个整数n和k,返回从1......n中选出的k个数的组合。解题思路: 该题是一个典型的深搜问题,解题思路是找 k 个数可以看成取 i 位置的元素(i 从 1 到 n - (k - 1)),然后在剩余的 i + 1 ~ n 之间取 k - 1 个数。递归实现取 k - 1 个元素的思路。void execFind(vector> &resul原创 2015-09-02 16:04:19 · 595 阅读 · 0 评论 -
组合(二)
问题: 给定一个含不同整数的集合,返回其所有的子集思路: 在组合(一)分析的基础上,这个问题只是求包含不同元素数量的子集合而已。//递归执行具体的查找工作 void execFind(vector> &result, vector nums, vector cur, int leftnum, int index){ if(原创 2015-09-02 16:12:22 · 450 阅读 · 0 评论 -
删除二叉查找树的节点
想对于二叉查找树的查找、插入等操作来说,二叉查找树的删除操作是比较复杂的。在具体的分析中可以根据待删除节点的:1、左右子树均为空;2、左右子树中有一个为空;3、左右子树均非空的情况来考虑。 其中第3种情况即左右子树均非空的情况较为复杂,删除过程中可以找待删除节点的后继节点,与待删除节点交换,然后把后继节点的右子树接入到待删除节点的父节点即可。 TreeNode* r原创 2015-09-01 11:06:18 · 1105 阅读 · 0 评论 -
链表排序
可以用对数组进行排序的方法对链表进行排序,但由于链表有单向访问的特点所以用归并排序比较合理。 ListNode *Merge(ListNode *pre1, ListNode *pre2){ ListNode *fir = pre1 -> next; ListNode *sec = pre2 -> next; ListNode *resu原创 2015-08-31 09:40:02 · 697 阅读 · 1 评论 -
下一个排列
该题的思路是从后向前扫描数组,找到第一对位置 i,j (i vector nextPermutation(vector &nums) { // write your code here int size = nums.size(); //标记数组是否为递减数组 bool flag = false;//找出从后向前第一个不递原创 2015-08-30 10:54:13 · 735 阅读 · 0 评论 -
前序遍历和中序遍历树构造二叉树
该问题用递归的思路很好解决,每一次取前序序列的首元素作为当前子树的根节点,然后在中序序列中找到对应的节点,以此可以确定根节点对应的左子树和右子树的序列长度,递归构造根节点的左子树和右子树即可。TreeNode *execBuild(vector &preorder, int prestart, int preend, vector &inorder, int instart, int inen原创 2015-08-31 17:06:46 · 906 阅读 · 0 评论 -
更新二进制位
该题的思路是首先把 int 对应的二进制形式转为 string(主要是 int 难以操作具体的位,转换为 string 形之后操作具体的位就简单多了)然后把 string 再转回 int 返回即可。 int updateBits(int n, int m, int i, int j) { // write your code here string sn, sm原创 2015-08-29 21:11:02 · 802 阅读 · 0 评论 -
乘积最大子序列
问题: 找出一个序列中乘积最大的连续子序列(至少包含一个数)。解题思路: 该题是典型的动态规划问题,考虑到序列中存在负数的情况,需要定义两个辅助数组,一个存储以当前元素结尾的最大乘积,一个记录以当前元素结尾的最小乘积。int maxProduct(vector& nums) { // write your code here原创 2015-09-05 19:47:50 · 517 阅读 · 0 评论