算法与数据结构
文章平均质量分 85
刷题记录
L.Jeremy
Talking is Cheap. Show me the Code.
展开
-
dp背包训练
1. 01背包最基础的背包问题,要求熟练掌握空间优化的方法.hdu 2602 Bone Collector#include <bits/stdc++.h>using namespace std;int t, n, v, c[1005], w[1005], dp[1005];int main() { scanf("%d", &t); whi...原创 2018-05-25 18:44:48 · 352 阅读 · 1 评论 -
NowCoder Winter Camp Contest IV
比赛链接:https://www.nowcoder.com/acm/contest/76#question 比赛时间:18.2.11 14:00 ~ 17:00 比赛内容:图论相关基础题目,包括bfs与dfs,最小生成树、最短路Dijstra、拓扑排序、强连通分量tarJan等图论相关的基础算法。适合图论新手。A 石油采集题目描述给你一个NxN的海洋网格,每一格都由.和#组成,.代表海面,#代表原创 2018-02-14 22:38:20 · 262 阅读 · 0 评论 -
NowCoder Winter Camp Contest II 题解
比赛链接:https://www.nowcoder.net/acm/contest/74#question 比赛时间:2018.1.28 14:00 ~ 17:00 比赛内容:DP+C语言水题。其中dp考察了01背包问题,区间dp-最优三角剖分,状压dp,树的重心等比较经典的DP问题,由于个人对DP的理解不多,又正值放假,拖到一周后才补完题,并写了这篇题解。A 吐泡泡题目描述给定一...原创 2018-02-09 20:34:11 · 216 阅读 · 0 评论 -
WHU Winter Camp Contest 5 (for Div 2) 题解
Time: 2018.1.26 12:30 ~ 17:301 Happy Three Friends题目来源 HDU - 49311.1 题目描述给你6个数,一个人从中选2个,一个人从剩下的4个中任选3个,问你第一个人的总和能不能大于第二个人的总和。1.2 题解水题,直接排序就可以。2 Maximum Increase题目来源 CodeForces - 702A原创 2018-01-27 17:07:21 · 217 阅读 · 0 评论 -
WHU Winter Camp Contest 3 (for Div 2) 题解
Time: 2017/1/24 12:30 ~ 17:301 Pasha and Stick题目来源于: CodeForces - 610A1.1 题目描述有多少个矩形的周长不超过n,不包括正方形1.2 思路简单题,就是半周长不超过n/2的矩形个数,从1开始数,一直数到floor(n/4)。注意当4|n时(数学表示,意思是4能整除n),需要减去该情况。2原创 2018-01-25 19:58:03 · 248 阅读 · 0 评论 -
LeetCode几道回文串题目
647. Palindromic Substrings给你一个长度不超过1000的字符串,判断该字符串包含多少回文子串。暴力法: 枚举子串,判断是否回文 动态规划:定义状态dp[i, j]为子串[i, j]是否为回文串。(这个状态定义在许多回文串问题中都有用到) 递归方程为dp[i, j] = j == i+1 ? s[i] == s[j] : dp[i+1, j-1] &...原创 2018-07-10 17:08:09 · 954 阅读 · 0 评论 -
LeetCode Largest Rectangle in Histogram
题目大意这题也是hdu 1506. 给定一个数组heights,其中heights[i]代表一个底为1,高为heights[i]的矩形。现在问你这个数组的所形成的“直方图”中最大的矩形面积。思路首先介绍一下单调队列与单调栈。顾名思义,就是容器内元素是单调的。重点就是在将元素压入容器的时候需要保持容器内的有序性。 对于单调栈来说,一个很简单的应用是:求某一个元素左边(右边)比它大(小...原创 2018-07-06 09:54:31 · 147 阅读 · 0 评论 -
LeetCode Next Greater Element I & II && III
题还是要当成吃饭睡觉一样每天坚持做规律做和总结的呀。496. Next Greater Element I有两个集合num1和num2,其中num1是num2的子集。让你找出对于每个num1的元素,在num2中再其右边的比其大的第一个数。由于集合最大不超过1000,因此O(n2)的遍历是一定能过的。但是,这种又和位置有关又和大小有关的要求,我想到了单调队列和单调栈。为什么呢?对于一...原创 2018-07-02 10:46:40 · 250 阅读 · 0 评论 -
LintCode 解题记录17.10.21
前言刷题的进度还是非常慢的,照这个进度,115道题估计过年前都刷不完。。真的是怠惰啊。House Robber题目描述给定一个数组,要求每次不能取相邻的两个数,求能取到所有数的最大和。思路初读一遍,发现是最优化问题(最大化),于是就思考最优化的两种思路 贪心和Dp。这里采用Dp的思想。我自己的思路就是采用 局部最优化与全局最优化的思想。设local[i]表示抢了第i家所能获得的最大利润,global原创 2017-10-23 20:24:32 · 237 阅读 · 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 · 245 阅读 · 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 · 295 阅读 · 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 · 397 阅读 · 0 评论 -
LintCode解题记录 动态规划专题 Part1 17.11.4
写在前面最近这一周多吧,都在做动态规划的题目。把一些经典的动态规划题目基础夯实(比如各大教材中关于动态规划章节所讲的例子),然后对每一道动态规划的题目,都要仔细思考 这个递归关系是怎么得来的,这样的话动态规划的功力才会得到进步。Minimum Path Sum题目描述给定一个mxn的非负整数矩阵,问你求得一条从左上到右下的路径,使得这条路径上的数字和最小,每次只能往下走一格或者往右走一格。返回这个最原创 2017-11-04 19:54:58 · 403 阅读 · 0 评论 -
动态规划之背包问题
前言背包问题是动态规划的一系列经典问题,想必不少人刚接触动态规划问题时都是从这一类问题入手。最近刷LintCode时遇到了动态规划的专题,结合一直想读却一直懒得读的《背包问题九讲》,特意开一篇Blog学习一下。正题1. 01 背包问题有N件物品和一个容量为V的背包。放入第i件物品耗费的费用是Ci,得到的价值是Wi。求解将哪些物品装入背包可以使价值总和最大。基本思路这是最基本的背包问题,特点是:每种物原创 2017-10-31 19:45:53 · 351 阅读 · 0 评论 -
LintCode 解题记录 17.10.14 拓扑排序
第六周,抽了周二、周四和周六三晚做了五道题,来总结一下吧。Clone Graph题目描述给你一幅图,还有一大堆Balabala关于图的介绍,然后返回这幅图的“克隆”。思路“克隆”是什么意思呢?就是对于你遍历到的每一个节点,用其节点的label值新建一个节点,然后对于其邻接节点也是如此的操作。此处遍历采用BFS的方法,需要一个OldNode->NewNode的一个map映射来实现。代码Undirect原创 2017-10-16 11:18:10 · 290 阅读 · 0 评论 -
LintCode 解题记录 17.10.5 递归
LintCode Balanced Binary Tree题目描述给定一棵树,判断其是不是平衡二叉树(Avl树)思路平衡二叉树的定义是对于一个二叉查找树来说,其每一个节点的平衡因子(左右子树高度差的绝对值)小于2。 所以思路就很明朗,对于每一个节点,先判断该节点是否满足平衡条件,如何不满足则直接返回false,如果满足就递归地判断其左子树和右子树。代码 bool isBalanced(Tre原创 2017-10-06 20:32:51 · 295 阅读 · 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 · 1250 阅读 · 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 · 287 阅读 · 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 · 281 阅读 · 0 评论 -
LintCode 解题记录 17.8.30 两个指针
前言暑假临近结束,自己也没有了学习的动力,每天只是打打酱油似的做了几道题,而且还迷上了吃鸡,疯狂和同学在网吧相约吃鸡,本来想着早点去学校调整调整状态的,结果被告知宿舍只能在开学的时候入住。闲着没事,干脆就学学习吧。LintCode Partition List给定一个链表L和一个数x,让你把这个链表排序,把值小于x的节点放在前面,值大于等于x的节点放在后面,要求各节点之间保持原有的顺序。思路可以声明原创 2017-08-30 16:55:25 · 324 阅读 · 0 评论 -
LintCode 解题记录17.8.19 字符串处理6
LintCode Scramble String判断给定两个等长的字符串是不是攀爬字符串。 对于给定的字符串,我们通过不断将其分割成两个非空子字符串的方式构建一棵二叉树。我们可以选择任一个非叶子节点然后交换其孩子节点,再重新从底部攀爬上去形成一个新字符串,那么该新字符串就与原字符串形成了攀爬字符串。思路由于二叉树是递归的建立的,那么我们就可以尝试从递归的角度来解决这个问题。对于两个字符串树tree原创 2017-08-19 21:57:49 · 299 阅读 · 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 · 305 阅读 · 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 · 340 阅读 · 0 评论 -
LintCode 解题记录 17.8.7 字符串处理3
LintCode Generate Parentheses给定n对括号,写一个函数去产生所有符合要求的括号组合。 思路 递归+回溯。 如何判断一个序号组合序列是有效的呢?我最先想到的是堆栈。左括号就入栈,右括号就出栈(前提栈不为空),如果空了就说明此时的组合不是合法的,就结束此次搜索。 还有一种简单的方法。针对从1~2n的序列,我们发现如下规则始终成立:左括号的个数大于等于右括号的个数。那么原创 2017-08-07 11:53:19 · 215 阅读 · 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 · 201 阅读 · 0 评论 -
LintCode 解题记录 字符串处理1.0 17.7.29
Before: 按照难度做的 ————————-Easy———————————LintCode Add Binary二进制求和。给定两个用字符串表示的二进制序列,求其和序列,同样以字符串表示。 1.思路 按照加法的规则来,从两个字符串的末尾(相当于最低位)开始加,维护进位位,把每次得到的结果顺序加在结果字符串上,最后利用reverse函数将结果字符串颠倒即为正确答案。 2.注意 要注意判断原创 2017-07-29 16:53:54 · 262 阅读 · 0 评论 -
LintCode 解题记录 Matrix专题
LintCode Matrix Zig Traversal按照之字形遍历输出矩阵。跟之前按照螺旋稳的方式遍历输出矩阵的题目很相似。 但是自己做起来就觉得总是这考虑不全那儿考虑不全,改来改去才能AC。 看了网上的解法,觉得比自己的要好,于是记录一下。 思路: 首先要明白之字形是怎么样的一种走法,可以概括为如下方式: 先沿斜右上方走到头,然后选择向右移动一位或者是像下移动一位。 然后沿斜左下原创 2017-07-26 21:19:25 · 409 阅读 · 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 · 228 阅读 · 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 · 261 阅读 · 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 · 445 阅读 · 0 评论 -
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 · 260 阅读 · 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 · 245 阅读 · 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 · 320 阅读 · 0 评论 -
LintCode 解题记录 17.5.19 (tag: Hash表2)
Hash表相关的题目对我来说有点吃力了。很多题目远超规定时间仍然想不出最优解。所以看别人的最优解、然后自己消化吸收就会花不少时间。希望能提高吧。 LintCode Majority Number 给定一个数组,找出其中出现次数大于数组大小一半的数。(输入数据保证只有唯一一个满足要求的解) 直接用Hash统计出现次数,然后判断即可。O(n)的时间与空间复杂度。 问:能否仅以O(1)的空间复杂度原创 2017-05-20 17:09:26 · 300 阅读 · 0 评论 -
LintCode 解题记录 17.5.15 (tag: 哈希表)
LintCode Flatten Nested List Iterator 把一个List压平,首先想到了Spark里的flattenMap函数- -。 两种思路,递归与非递归。递归就不说了,非递归的就用栈来实现。为什么要用栈呢?比如我当前遍历到一个元素仍然是一个List,那么我应该是再把这个List的元素全部压到栈里然后立即依次取出来处理,所以是后入先出,所以用堆栈来实现。 递归:class原创 2017-05-16 14:18:09 · 767 阅读 · 1 评论 -
LintCode 解题记录17.5.13(tag: Union Find)
Union Find - 并查集。 看到这里最先 想到的就是 最小生成树的Kruscal算法利用并查集来实现。脑海里回忆一下思路与代码。LintCode 178 图是否是树 图是否是树有两个条件: 1.是否形成了环路 2.是否只有一个连通块 自然就会想到常见的求连通块的方法,并查集 || DFS。至于判断是否有环,题目中说明了是无向图。(如果是有向图,又如何判断呢?) 由于题目中说了输入原创 2017-05-13 14:31:09 · 419 阅读 · 0 评论 -
LintCode 解题记录17.5.10(tag:线段树)
第一次学习“线段树”这种数据结构。记录一下LintCode线段树相关的题目。LintCode 201 线段树的构造 每个节点代表一个[start, end]的间隔(interval),同时还可以用第三变量val来存储和具有区间和性质的变量(比如该区间的最大值、最小值、元素和、元素个数等等)。具有区间和的意思就是说在一个区间上的操作是否可以转化为两个子区间上的操作。 父亲节点的间隔为[start,原创 2017-05-10 21:37:10 · 389 阅读 · 0 评论 -
LintCode 解题记录 2017.5.8 (字典树)
这几天主要做了一下LintCode上有关字典树的相关题目(其实一共就3道),写个总结。 这也是我第一次接触 字典树 这种数据结构。 LintCode 442 实现Trie 基础题,实现字典树的数据结构与一些简单的函数。字典树的相关概念我觉得很好理解,具体用途可能就是避免大量重复查找吧。class TrieNode {public: bool isWord;//判断是否是一个单词,比如原创 2017-05-08 11:55:44 · 331 阅读 · 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 · 290 阅读 · 0 评论 -
LintCode解题记录 17.5.3
Tips: 忙着改毕业论文,忙着完成导师布置的任务,只能自己偷偷的在晚上的时候刷题- - 最近主要做了一下二叉顺序树的相关题目,题目总体难度一般。LintCode 661 Convert BST to Greater Tree 虽然是Easy难度的题,但还是很有新意的:D,稍微思考了一下,树相关的题目一定是和递归紧紧联系在一起的,所以这道题就是从最右的叶子节点开始遍历,按照右子树、根节点、左子原创 2017-05-04 13:47:38 · 426 阅读 · 0 评论