![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
LintCode题解
文章平均质量分 85
L.Jeremy
Talking is Cheap. Show me the Code.
展开
-
LintCode 解题记录17.5.10(tag:线段树)
第一次学习“线段树”这种数据结构。记录一下LintCode线段树相关的题目。LintCode 201 线段树的构造 每个节点代表一个[start, end]的间隔(interval),同时还可以用第三变量val来存储和具有区间和性质的变量(比如该区间的最大值、最小值、元素和、元素个数等等)。具有区间和的意思就是说在一个区间上的操作是否可以转化为两个子区间上的操作。 父亲节点的间隔为[start,原创 2017-05-10 21:37:10 · 372 阅读 · 0 评论 -
LintCode 解题记录 Matrix专题
LintCode Matrix Zig Traversal按照之字形遍历输出矩阵。跟之前按照螺旋稳的方式遍历输出矩阵的题目很相似。 但是自己做起来就觉得总是这考虑不全那儿考虑不全,改来改去才能AC。 看了网上的解法,觉得比自己的要好,于是记录一下。 思路: 首先要明白之字形是怎么样的一种走法,可以概括为如下方式: 先沿斜右上方走到头,然后选择向右移动一位或者是像下移动一位。 然后沿斜左下原创 2017-07-26 21:19:25 · 355 阅读 · 0 评论 -
LintCode 解题记录17.8.4 字符串处理2
Distinct Distance给定字符串S和T,求S中T的子串的个数。这里的子串是指不连续的子串。比如S=”rabbbit”,T=”rabbit”,那么S有三个rabbit子串。(中间的3个b有3种取2个b的取法) 思路 这一是一道动态规划的题目,我们维护的状态变量是S中前i个字符中T的前j个字符的个数dp[i][j],接下来的目标就是寻找递归关系。递推关系大部分都是dp[i][j]和dp[原创 2017-08-04 14:11:09 · 172 阅读 · 0 评论 -
LintCode 解题记录17.8.19 字符串处理6
LintCode Scramble String判断给定两个等长的字符串是不是攀爬字符串。 对于给定的字符串,我们通过不断将其分割成两个非空子字符串的方式构建一棵二叉树。我们可以选择任一个非叶子节点然后交换其孩子节点,再重新从底部攀爬上去形成一个新字符串,那么该新字符串就与原字符串形成了攀爬字符串。思路由于二叉树是递归的建立的,那么我们就可以尝试从递归的角度来解决这个问题。对于两个字符串树tree原创 2017-08-19 21:57:49 · 285 阅读 · 0 评论 -
LintCode 解题记录 17.8.7 字符串处理3
LintCode Generate Parentheses给定n对括号,写一个函数去产生所有符合要求的括号组合。 思路 递归+回溯。 如何判断一个序号组合序列是有效的呢?我最先想到的是堆栈。左括号就入栈,右括号就出栈(前提栈不为空),如果空了就说明此时的组合不是合法的,就结束此次搜索。 还有一种简单的方法。针对从1~2n的序列,我们发现如下规则始终成立:左括号的个数大于等于右括号的个数。那么原创 2017-08-07 11:53:19 · 177 阅读 · 0 评论 -
LintCode解题记录-Catalan Number
Catalan Number 卡特兰数1.基本定义组合数学中的知识,定义:令h(0) = h(1) =1, 则若h(n) = h(0)*h(n-1)+h(1)*h(n-2)+…+h(n-1)*h(0) (n >= 2),则称h(n)为卡特兰数。 例如: h(2) = h(0)*h(1) + h(1)*h(0) = 1*1 + 1*1 = 2, h(3) = h(0)h(2) + h(1)原创 2017-09-14 20:06:10 · 251 阅读 · 0 评论 -
LintCode 解题记录 17.8.30 两个指针
前言暑假临近结束,自己也没有了学习的动力,每天只是打打酱油似的做了几道题,而且还迷上了吃鸡,疯狂和同学在网吧相约吃鸡,本来想着早点去学校调整调整状态的,结果被告知宿舍只能在开学的时候入住。闲着没事,干脆就学学习吧。LintCode Partition List给定一个链表L和一个数x,让你把这个链表排序,把值小于x的节点放在前面,值大于等于x的节点放在后面,要求各节点之间保持原有的顺序。思路可以声明原创 2017-08-30 16:55:25 · 293 阅读 · 0 评论 -
LintCode解题记录 - 位操作
Tips:已经正式作为一名研究生啦:D.LintCode Product of Array Exclude Itself给定一个数组A,定义B[i] = A[0]…*A[i-1]*A[i+1]…*A[n-1].求数组B,但是在计算的时候请不要用除法。思路可以把B[i]看成两部分,即i的前缀积和i的后缀积,其中后缀积如果采用倒序遍历的方式掉话也就相当于前缀积。两次遍历,时间复...原创 2017-09-09 18:20:55 · 246 阅读 · 0 评论 -
LintCode 解体记录 17.9.26
最近忙于上课、健身,也不愿抽出时间来做题了。。是懒了许多。LintCode Add Digits题目描述给定一个非负的整数,重复地把该数所有位上的数字加起来,直到只有一个数字。挑战Could you do it without any loop/recursion in O(1) runtime?思路利用模10除10求得整数上的每一位之后,相加,循环处理直到得到的数小于10. 至于挑战的思路,是看原创 2017-09-27 11:09:22 · 1217 阅读 · 0 评论 -
LintCode 解题记录 17.10.5 递归
LintCode Balanced Binary Tree题目描述给定一棵树,判断其是不是平衡二叉树(Avl树)思路平衡二叉树的定义是对于一个二叉查找树来说,其每一个节点的平衡因子(左右子树高度差的绝对值)小于2。 所以思路就很明朗,对于每一个节点,先判断该节点是否满足平衡条件,如何不满足则直接返回false,如果满足就递归地判断其左子树和右子树。代码 bool isBalanced(Tre原创 2017-10-06 20:32:51 · 256 阅读 · 0 评论 -
动态规划之背包问题
前言背包问题是动态规划的一系列经典问题,想必不少人刚接触动态规划问题时都是从这一类问题入手。最近刷LintCode时遇到了动态规划的专题,结合一直想读却一直懒得读的《背包问题九讲》,特意开一篇Blog学习一下。正题1. 01 背包问题有N件物品和一个容量为V的背包。放入第i件物品耗费的费用是Ci,得到的价值是Wi。求解将哪些物品装入背包可以使价值总和最大。基本思路这是最基本的背包问题,特点是:每种物原创 2017-10-31 19:45:53 · 316 阅读 · 0 评论 -
LintCode 解题记录 17.10.14 拓扑排序
第六周,抽了周二、周四和周六三晚做了五道题,来总结一下吧。Clone Graph题目描述给你一幅图,还有一大堆Balabala关于图的介绍,然后返回这幅图的“克隆”。思路“克隆”是什么意思呢?就是对于你遍历到的每一个节点,用其节点的label值新建一个节点,然后对于其邻接节点也是如此的操作。此处遍历采用BFS的方法,需要一个OldNode->NewNode的一个map映射来实现。代码Undirect原创 2017-10-16 11:18:10 · 269 阅读 · 0 评论 -
LintCode 解题记录 17.11.11
前言又是一年双11,今日你剁手了吗?被同学忽悠没忍住买了台显示器,1000左右,不得不说京东白条真是无底洞啊。。Paint House题目描述有n个房子,每个房子都可以被涂红、蓝、绿三种颜色,假设第i个房子(i从0开始)涂第j个颜色的花费是cost[i, j], j = 0, 1, 2分别代表上述三种颜色。现在要求相邻的两间屋子不能涂相同的颜色,问你最小花费。思路跟House Robber很相似的题原创 2017-11-11 18:45:17 · 351 阅读 · 0 评论 -
LintCode解题记录 动态规划专题 Part1 17.11.4
写在前面最近这一周多吧,都在做动态规划的题目。把一些经典的动态规划题目基础夯实(比如各大教材中关于动态规划章节所讲的例子),然后对每一道动态规划的题目,都要仔细思考 这个递归关系是怎么得来的,这样的话动态规划的功力才会得到进步。Minimum Path Sum题目描述给定一个mxn的非负整数矩阵,问你求得一条从左上到右下的路径,使得这条路径上的数字和最小,每次只能往下走一格或者往右走一格。返回这个最原创 2017-11-04 19:54:58 · 354 阅读 · 0 评论 -
LintCode解题记录 17.12.2 LinkedList
99.Reorder List题目描述给定一个单链表L : L0 -> L1 -> L2 … -> Ln,将其重新排序,变成L0->Ln->L2->Ln-2…这样的形式。要求不能通过改变节点的值来实现。思路这是一道链表的综合性题目,考察了许多链表相关操作的小知识。为了实现题目的要求,我们按照如下3步来实现:Step1.O(n)下找到链表的中点mid(奇数长度则为中间的那一个点,偶数长度则为第左边的那原创 2017-12-02 19:17:55 · 218 阅读 · 0 评论 -
LintCode解题记录17.8.9 字符串处理5
LintCode Binary Representation给定一个数(包含小数),返回其二进制形式。如果小数点后的二 进制位大于32位,则返回ERROR。 思路 整数部分转化为二进制是模2取余,小数部分是乘2取整。 代码 string binaryRepresentation(string n) { // wirte your code here in原创 2017-08-10 15:47:43 · 265 阅读 · 0 评论 -
LintCode 解题记录 字符串处理1.0 17.7.29
Before: 按照难度做的 ————————-Easy———————————LintCode Add Binary二进制求和。给定两个用字符串表示的二进制序列,求其和序列,同样以字符串表示。 1.思路 按照加法的规则来,从两个字符串的末尾(相当于最低位)开始加,维护进位位,把每次得到的结果顺序加在结果字符串上,最后利用reverse函数将结果字符串颠倒即为正确答案。 2.注意 要注意判断原创 2017-07-29 16:53:54 · 238 阅读 · 0 评论 -
LintCode解题记录 17.5.3
Tips: 忙着改毕业论文,忙着完成导师布置的任务,只能自己偷偷的在晚上的时候刷题- - 最近主要做了一下二叉顺序树的相关题目,题目总体难度一般。LintCode 661 Convert BST to Greater Tree 虽然是Easy难度的题,但还是很有新意的:D,稍微思考了一下,树相关的题目一定是和递归紧紧联系在一起的,所以这道题就是从最右的叶子节点开始遍历,按照右子树、根节点、左子原创 2017-05-04 13:47:38 · 403 阅读 · 0 评论 -
LintCode 解题记录17.5.13(tag: Union Find)
Union Find - 并查集。 看到这里最先 想到的就是 最小生成树的Kruscal算法利用并查集来实现。脑海里回忆一下思路与代码。LintCode 178 图是否是树 图是否是树有两个条件: 1.是否形成了环路 2.是否只有一个连通块 自然就会想到常见的求连通块的方法,并查集 || DFS。至于判断是否有环,题目中说明了是无向图。(如果是有向图,又如何判断呢?) 由于题目中说了输入原创 2017-05-13 14:31:09 · 383 阅读 · 0 评论 -
LintCode解题记录17.4.28
今天主要刷和Heap相关的几道题。 LintCode 130 Heapify 给一个vector,根据此来建立min_heap。重要,需要掌握! 注意一个细节: 若数组编号从1开始,则对于编号为i的节点来说,其左孩子编号为2i,右孩子编号为2i+1,父亲节点编号为i/2。 若数组编号从0开始,则左孩子编号为2i+1,右孩子编号为2i+2,父亲节点编号为(i-1)/2。cla原创 2017-04-29 14:46:15 · 271 阅读 · 0 评论 -
LintCode 解题记录 2017.5.8 (字典树)
这几天主要做了一下LintCode上有关字典树的相关题目(其实一共就3道),写个总结。 这也是我第一次接触 字典树 这种数据结构。 LintCode 442 实现Trie 基础题,实现字典树的数据结构与一些简单的函数。字典树的相关概念我觉得很好理解,具体用途可能就是避免大量重复查找吧。class TrieNode {public: bool isWord;//判断是否是一个单词,比如原创 2017-05-08 11:55:44 · 318 阅读 · 0 评论 -
LintCode 解题记录17.4.27
2017.4.27 第一次刷LintCode 1.二叉树最大节点 树的代码大多和递归紧紧结合。注意递归终止的返回条件,以及需要判断返回的节点是否为NULLclass Solution {public: /** * @param root the root of binary tree * @return the max node */ Tree原创 2017-04-27 21:11:39 · 276 阅读 · 0 评论 -
LintCode 解题记录 17.5.15 (tag: 哈希表)
LintCode Flatten Nested List Iterator 把一个List压平,首先想到了Spark里的flattenMap函数- -。 两种思路,递归与非递归。递归就不说了,非递归的就用栈来实现。为什么要用栈呢?比如我当前遍历到一个元素仍然是一个List,那么我应该是再把这个List的元素全部压到栈里然后立即依次取出来处理,所以是后入先出,所以用堆栈来实现。 递归:class原创 2017-05-16 14:18:09 · 724 阅读 · 1 评论 -
LintCode 解题记录 Array 17.6.5
周六做的几道题目,今天周一抽一个上午总结一下。 首先贴两张图,用来激励自己吧。 LintCode Combinations 给定两个数n和k,返回1~n中的任取k个数的所有组合。 dfs+回溯。难度一般。 vector<vector<int> > combine(int n, int k) { // write your code here vect原创 2017-06-05 12:35:46 · 242 阅读 · 0 评论 -
LintCode 解题记录 17.5.19 (tag: Hash表2)
Hash表相关的题目对我来说有点吃力了。很多题目远超规定时间仍然想不出最优解。所以看别人的最优解、然后自己消化吸收就会花不少时间。希望能提高吧。 LintCode Majority Number 给定一个数组,找出其中出现次数大于数组大小一半的数。(输入数据保证只有唯一一个满足要求的解) 直接用Hash统计出现次数,然后判断即可。O(n)的时间与空间复杂度。 问:能否仅以O(1)的空间复杂度原创 2017-05-20 17:09:26 · 283 阅读 · 0 评论 -
LintCode 解题记录 17.5.31(tag:Array)
最近由于毕业答辩,碰巧撞上端午假期,所以一直没有静下心来做题。今天终于清闲下来了,于是刷一刷题。 第一题 LintCode 132 Pattern 没做出来。上网看了别人的思路,用stack保存最大的数,用third保存次大的数,然后从后往前遍历。 代码: bool find132pattern(vector<int>& nums) { stack<int> s;原创 2017-06-01 10:36:24 · 284 阅读 · 0 评论 -
LintCode 解题记录 2017.6.3
主要记录一下昨天做的5道题目。有3道题目没有在给定时间内AC,也是菜的咯。第一题 LintCode Coins in a line 给定一排n个硬币,从第一个玩家开始从右边取硬币,每次可取一个或者两个硬币,两位玩家轮流进行,取走最后一枚硬币的玩家获胜。问给定n,判断玩家1是否能否获胜? 思路:反向递推法。要想玩家1能取走最后一枚硬币,那么玩家1一定要取走第4枚硬币;要想玩家1能取走第4原创 2017-06-03 10:57:45 · 208 阅读 · 0 评论 -
LintCode 解题记录17.6.26 ~ 17.7.2
6.26LintCode Wiggle Sort给定一个未排序的数组,要求按照如下规则原地排序: nums[0] <= nums[1] >= nums[2] <= nums[3]… 答案会有很多种,输出其中一种就可以。 自己的思路:按照这样的选择规则就可以:首先把数组排序,然后nums[0],nums[2],nums[4]..这些从小到大选,而nums[1],nums[3],nums[5].原创 2017-06-27 15:22:27 · 226 阅读 · 0 评论 -
LintCode 解题记录 7.11 ~ 7.16
7.1~7.10号去南京玩了,所以没有刷题。现在回来了,题目继续搞起吧~LintCode Median of Two Sorted ArrayHARD题,没做出来。 看完网上的思路来总结一下: 这题可以转换为topK问题来解决,已知有序数组A和数组B,其合并后的中位数就是求其第k(k = (A.size+B.size)/2 )小数的问题。我们可以分别在数组A和B中考虑第k/2数,即A[k/2-1原创 2017-07-11 12:07:54 · 187 阅读 · 0 评论 -
LintCode 解题记录 17.6.19~17.6.25
大概有十几天没有做题了,主要是出差大概耽误了一周左右的时间,进度又跟不上了。17.6.19 晚LintCode Next PermutationsII给定一个序列,求其下一个序列。比如123下一个序列就是132,如果已经是最大的序列321,那么会回到最小的123。 思路:从序列的末尾开始看起,如果对于位置i的数,从i+1~n-1的数全部小于位置i的数,那么说明从位置i开始的数就是最大的。如果发现一原创 2017-06-19 21:35:17 · 426 阅读 · 0 评论 -
LintCode 解题记录17.8.8 字符串处理4
LintCode Restore IP Addresses给定一个由数字组成的字符串,返回能复原的有效Ip地址。 注意:有效的Ip地址指每一位都在0~255之间。 思路 Dfs,每跳一次就是一个子网段,然后在后面加个’.’。那么根据题意可以知道每次最多可以跳三步,如果当前位为0则只能跳一步。组成的数还必须符合0~255的条件。 代码 vector<string> restoreIpAd原创 2017-08-08 15:47:20 · 300 阅读 · 0 评论 -
LintCode解题记录 17.11.25 反转单链表
前言这一周由于晚上课比较多,所以没有怎么做题。趁周五没有啥事来做几题。35. Reverse Linked List题目描述正如其字面意思,反转一个单链表。要求* Do it in-place and in one-pass *思路如果是仅要输出单链表的反序,可以用一个递归,回溯的时候打印输出即可。 单纯只是觉得需要掌握这种递归的思路。void ReversePrint(ListNode *hea原创 2017-11-25 15:56:23 · 255 阅读 · 0 评论