
algorithm
LOVETEDA
这个作者很懒,什么都没留下…
展开
-
在两个排序数组中找第k小的数
题目描述给定两个有序数组arr1和arr2,再给定一个整数K,返回所有数中第K小的数。[要求]如果arr1的长度为N,arr2的长度为M,时间复杂度请达到O(\log(\min{N, M}))O(log(minN,M)),额外空间复杂度O(1)O(1)。输入描述:第一行三个整数N, M, K分别表示数组arr1, arr2的大小,以及需要询问的数接下来一行N个整数,表示arr1内的元...原创 2020-04-15 21:32:42 · 1195 阅读 · 0 评论 -
leetcode 239 Sliding Window Maximum
Given an array nums, there is a sliding window of size k which is moving from the very left of the array to the very right. You can only see the k numbers in the window. Each time the sliding window...原创 2020-03-30 20:59:48 · 268 阅读 · 0 评论 -
最长递增子序列问题
题目描述给定数组arr,设长度为n,输出arr的最长递增子序列。(如果有多个答案,请输出其中字典序最小的)输入描述:输出两行,第一行包括一个正整数n(n<=100000),代表数组长度。第二行包括n个整数,代表数组arr \left(1 \leq arr_i \leq 1e9 \right)(1≤arri≤1e9)。输出描述:输出一行。代表你求出的最长的递增子序列。...原创 2020-02-25 15:56:45 · 2087 阅读 · 1 评论 -
LCA(lowest common ancestor)并查集解法
首先是最近公共祖先的概念(什么是最近公共祖先?): 在一棵没有环的树上,每个节点肯定有其父亲节点和祖先节点,而最近公共祖先,就是两个节点在这棵树上深度最大的公共的祖先节点。 换句话说,就是两个点在这棵树上距离最近的公共祖先节点。 所以LCA主要是用来处理当两个点仅有唯一一条确定的最短路径时的路径。 有人可能会问:那他本身或者其父亲节点是否可以作为祖先节点呢?...转载 2020-02-23 22:18:57 · 1009 阅读 · 1 评论 -
leetcode 45 Jump Game II Greedy(反证法证明)
题目大意:有一个数组nums,nums[i]表示在下标i上,最多可以向前跳nums[i]个数字,求从下标0到下标nums.size()最少的跳数。我的思路是建立一个辅助的数组steps,steps[i]表示从下标0跳到下标i的最少跳数,显然,steps是一个非递减的数组。我们先把结论给出来:设x是从下标0向后数第一个可以一步跳到i的下标,则steps[i]=steps[x]+1。即从下标0...原创 2019-04-23 14:15:31 · 252 阅读 · 0 评论 -
leetcode44 wildcard matching递推方法+trick方法
通配符匹配。简单来说就是判断字符串s和pattern字符串p是否匹配,p中的?符号表示任意一个字符,p中的*符号表示任意一个字符序列。首先说说我自己的递推的思想:虽然很多人说这种是动态规划的解法,但我本人并不认同这种说法,如果严格按照动态规划的定义划分的话,这个既没有最优子结构也没有重复计算的问题。不过不用在意这些细节了。设一个二维数组bp,bp[i][j]的语义是:s的前i个字符和p...原创 2019-04-17 21:23:24 · 189 阅读 · 0 评论 -
leetcode 17. Letter Combinations of a Phone Number 深度优先搜索
题目大意就是:手机上的九键建立了一个数字和字母的对应关系,一个数字可能对应多个字母。输入一串数字,每个数字用一个它对应的某个字母代替,这一串数字就转化成了一串字母,输出所有可能的字母。这道题用DFS搜索就可以求解了。以输入“232”为例。2对应a,b,c三个字母。3对应着d,e,f 这三个字母。首先是第一层数字2,第一层为数字2对应的第一个字母a接着到第二层数字3,第二层为数字3对...原创 2019-04-01 16:52:43 · 208 阅读 · 0 评论 -
leetcode 33 Search in Rotated Sorted Array Binary Search
某个有序数组,按照某个枢轴值逆置以后,搜索指定的元素。假设没有重复的元素例如[2,3,4,5,8,9]这个数组,在5和8之间进行逆置,得到了数组nums:[8,9,2,3,4,5],我们在这个数组中搜索某个元素。我的思路很简单:这个数组可以分解成两个子数组:[8,9]和[2,3,4,5],每个子数组都是升序排列,用两次二分查找就好了。那么难点就是如何通过二分查找找到枢轴值pivot=9?...原创 2019-04-10 14:38:21 · 202 阅读 · 0 评论 -
leetcode10 Regular Expression Matching
这道题我光读题就读了很长时间。题意是判断字符串s和p是否匹配,s只含有小写字母,p含有小写字母和'.' '*'两个字符'.' 字符表示任意字符,可以和任意一个字符匹配 '*'表示0个或多个前一个字符,例如a*当中的*表示0个或多个a所以s="aaa" p="a*" 是匹配的,因为*可以转化成2个a。同理s="b" p="ba*"也是匹配的,因为*可以变成0个a。这道题的难点...原创 2019-03-18 16:29:21 · 214 阅读 · 0 评论 -
leetcode76 Minimum Window Substring滑动窗口
https://leetcode.com/problems/minimum-window-substring/题目大意:给定一个字符串S,和一个字符串T,求S的一个子串,包含T的所有字符,且子串最小。我们应用滑动窗口的思想,首先我们知道包含T的所有字符,最小的子串一定以T的字符开头以T的字符结尾。两个指针l和r,表示滑动窗口的两端,我们举个例子:S="ADOBECODEBANC" ...原创 2019-05-13 23:18:53 · 196 阅读 · 0 评论 -
leetcode89 Gray Code
题目大意:输入一个数字n,输出一个整数序列,是n位二进制,每个相邻的数字只有一位二进制位的不同。这道题看过网上的其他的一些解法,什么移位之后再做异或,感觉这种方法实在是太trick了,我根据一些提示用的递归的方法来做首先观察n=2的输出:00,01,11,10接着观察n=3的输出:000,001,011,010,110,111,101,100n=3的输出,前四个元素是最高位为0,不...原创 2019-05-15 10:06:22 · 176 阅读 · 0 评论 -
leetcode84. Largest Rectangle in Histogram 分治+线段树
题目大意:输入一个整数数组,每个整数表示一个宽度为1的矩形,相邻整数对应的矩形相邻,求所有矩形的区域里面,围成的面积最大矩形的面积。链接:https://leetcode.com/problems/largest-rectangle-in-histogram/我们以输入[2,1,5,6,2,3]为例。最大的矩形是高度为5的矩形和高度为6的矩形构成的,面积为10。我们可以发现,给定起...原创 2019-05-27 14:53:29 · 209 阅读 · 0 评论 -
leetcode124 Binary Tree Maximum Path Sum
题目大意:二叉树的任意一条路径上所有节点求和。求最大路径是多少。我的思路就是分治法。最大路径有三种可能:1、左子树的最大路径。2、右子树的最大路径。3、横跨根节点的最大路径。左子树和右子树的最大路径可以递归求得。关键是横跨根节点的最大路径。我的思路是:求以左子树根节点结尾的最大路径l,再求以右子树根节点结尾的最大路径r。那么横跨根节点的最大路径可以写成:int result=r...原创 2019-06-17 23:35:39 · 169 阅读 · 0 评论 -
(代码) 后缀数组+lcp的c++实现
suffix array后缀数组一般用于字符串匹配问题当中,一般来说可以用suffix tree解决的字符串匹配问题用suffix array都可以解决.主要参考了geeksforgeeks上关于后缀数组和lcp(longest common prefix)的教程.https://www.geeksforgeeks.org/suffix-array-set-2-a-nlognlogn-al...原创 2019-06-24 15:24:42 · 1531 阅读 · 0 评论 -
leetcode146 LRU cache Design
第一次写这种类型的程序,感觉挺好玩的.LRU就是 Least Recently Used.LRU Cache就是一种缓存机制,当缓存已经满了的时候,最近最少使用的元素移出缓存换上新的元素.我们采用双向链表来判断最近最少使用的元素.我们保存指向双向链表的所有元素的指针,当访问一个元素的时候,把双向链表中的该元素移动到队尾.即只要使用某个元素,就把该元素移动到队尾,所以队尾是最近最多使用的元素,队...原创 2019-07-03 10:52:44 · 302 阅读 · 0 评论 -
leetcode152 Maximum Product Subarray
求子数组的最大积.我一开始联想到的是子数组的最大和,动态规划经典题目,但是这道题好像不能用DP来解.我采用的是一种很直观的解法,求子数组最大积的时候,最特殊的就是0,0乘任何数都等于0.所以,假设有这样的一个数组1,4,-5,9,-3,-4,0,1,-4,9,7,-30把这个数组分成了两个子数组,则最大积就是这两个子数组最大积的最大值(大多数情况下是,暂时不考虑特殊边界条件).所以...原创 2019-07-23 15:00:08 · 229 阅读 · 0 评论 -
leetcode15 3Sum leetcode16 3SumClosest
两道题大同小异,15题是从一个数组中找到三个数(一个triplet)的和为0,找到所有和为0的triplet,返回一个vector<vector<int>>。这道题我试过brute force是超时的。我最开始的思路是这样的:设数组nums[0] nums[1] ...... nums[n-2] nums[n-1] 首先对数组进行排序操作。在nums[0...原创 2019-03-25 11:02:10 · 176 阅读 · 0 评论 -
leetcode94 Binary Tree Inorder Traversal 非递归二叉树中序遍历
中序遍历的定义是:首先中序遍历左子树,接着遍历根节点,最后中序遍历右子树根据这个思路我们就可以试着写出非递归版本的程序。所用的数据结构自然就是栈,首先将根节点入栈,当把左子树中序遍历完了以后,把根节点出栈,再中序遍历右子树。我们定义节点出栈的过程就是遍历该节点,初始状态我们先让根节点入栈。由于我们首先遍历的是左子树,所以我们首先不停地进行栈顶元素左孩子入栈操作,直到栈顶元素没有左...原创 2019-03-12 14:39:28 · 178 阅读 · 0 评论 -
HDOJ1041 Computer Transformation 递推+大数
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1041题目大意:定义这样的一个转换规则:0->1 0,1->0 1。初始只有一个数字1,按照转换规则,第一步之后数字变成01,第二步之后数字编程1001。。。以此类推。我们定义两个连续的0为一对0,求经过n步以后有多少个一对0。首先需要明确永远不可能出现三个或以上的连续0。我们要求的...原创 2019-02-14 11:13:46 · 242 阅读 · 0 评论 -
HDOJ 1114 Piggy-Bank
题目大意:已知存钱罐猪的重量和存钱罐猪以及罐内硬币的总重量,已知每种硬币的面值与重量,每种硬币数量无限,求罐内硬币的最小面值。输入。T:总的案例个数,针对每个案例有E,F:罐的重量以及罐+硬币的总重量。N:硬币的种类数,之后有N行,每行为P:硬币的面值,以及W:硬币的重量。这个题目要求硬币的总重量应该恰好等于F-E,如果根据给定的硬币数据,硬币的重量无法恰好等于F-E,则输出Impossi...原创 2018-09-25 21:23:52 · 401 阅读 · 0 评论 -
HDOJ1069 Monkey and Banana
题目大意:输入数字n表示箱子的种类数,下面有n行数据,每行数据有三个数据xi,yi,zi表示一种箱子的数据。每种箱子有无限个,xi,yi,zi中的任意两个数字都可以作为箱子的长、宽,剩下的一个数字表示箱子的高。从下往上堆积箱子,上面箱子的长、宽必须严格小于下面箱子的长、宽(不能相等),求堆积箱子的最大高度。首先任意一行数据都可以等价为六种箱子。设(x,y,z)表示一种箱子的长、宽、高分别为x,...原创 2018-10-05 11:00:32 · 227 阅读 · 0 评论 -
HDOJ1074 状态压缩动态规划
这道题是我第一次接触状态压缩dp,记录下来留个纪念吧。http://acm.hdu.edu.cn/showproblem.php?pid=1074题目大意:输入T表示案例数,每个案例首先输入N表示学科数。接下来有N行,每行三个数据分别是学科名字、学科作业的截止天数、做这门学科的作业需要耗费的天数。当超过某一门学科的截止时间完成作业的时候,超过几天就扣多少分,学科名字按照字典序递增的顺序输入...原创 2018-10-16 10:27:48 · 248 阅读 · 0 评论 -
hdoj1078 FatMouse and Cheese
http://acm.hdu.edu.cn/showproblem.php?pid=1078题目大意:输入n,有一个n*n的方格,每个方格里面有0-100个奶酪,老鼠起始在(0,0)方格,每次最多水平或竖直走k个方格,每到一个方格就拿到方格里的所有奶酪。每次只能到比当前方格奶酪数更多的方格中去。求当老鼠不能移动的时候,拿到的最多奶酪数。题目用到了记忆化搜索,我用的记忆化搜索方法和网上给出的...原创 2018-10-17 10:27:31 · 276 阅读 · 0 评论 -
学习笔记:求数组的最长递增子序列LIS
数组的最长递增子序列LIS是一类经典问题。例如数组2,1,5,3,6,4,8,9,7。此数组的LIS为1,3,4,8,9长度为5。如果用经典的动态规划算法求解的话,设f[i]为以i结尾的LIS的长度。例如求f[8],即以8结尾的LIS的长度,那么f[ 8]=max{ f[2]+1 ,f[1]+1, f[5]+1, f[3]+1, f[6]+1, f[4]+1}。此时需要遍历8以前的所有元素。求...原创 2018-10-25 11:51:34 · 490 阅读 · 0 评论 -
HDOJ1007求最近点对
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1007题目大意就是输入N个玩具的坐标,每个玩具作为一个点来处理,最后输出最近点对距离的一半。题目采用分治的思想解决,首先对所有的点根据x坐标进行排序,找到所有点下标的中卫数mid,以mid点的横坐标xmid作为分割线,即分割线为x=xmid,将所有点集分为左右两个子集,递归地求两个点集的最短距离dl...原创 2018-11-06 10:44:21 · 309 阅读 · 0 评论 -
HDOJ1003最大和子数组(动态规划)
http://acm.hdu.edu.cn/showproblem.php?pid=1003题目大意:输入T为总的案例数,每个案例中首先输入N表示数组长度,随后输入N个数a[1]-a[N]表示一个数组,求一个子数组,要求这个子数组所有数加起来和最大,并输出这个子数组的起始下标,如果有多个子数组都是和最大的,则输出第一个满足条件的子数组的下标。考虑前N个元素(数组所有元素),设f[N]为从前...原创 2018-11-06 21:55:24 · 239 阅读 · 0 评论 -
HDOJ1042 大数*小数
题目很简单,就是输入一个N,求N的阶乘。这个题目是一个大数乘小数的问题,例如N! =(N-1)! * N,这里,(N-1)!为大数,表示为字符串的形式,N为小数,表示为int的形式。这道题的重点就是写一个函数实现一个大数乘小数。一开始我的做法是大数和小数全部作为字符串处理,类似于小学时的基本的竖式乘法来计算,这样的话时间复杂度会非常高,设大数有x位数字,小数有y位数,需要有xy次访问,并且...原创 2018-12-06 09:48:30 · 674 阅读 · 0 评论 -
HDOJ1080 基因序列相似度(动态规划)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1080题目大意:基因序列里面有四个字符ACTG,对于个基因序列,从中插入“-”符号让两个基因序列一样长。对于ACGT-这五个符号,任意两个符号都有一个对应的得分,给定一个对应符号的得分矩阵,求两个基因序列插入-符号以后得分的最大值。例如:AGTGATG和GTTAG这两个基因序列,插入-符号使两个...原创 2018-12-16 17:40:54 · 3180 阅读 · 0 评论 -
算法导论动态规划总结
适合应用动态规划解决的问题具备两个要素:最优子结构和子问题重叠。最优子结构:如果一个问题的最优解包含了其子问题的最优解,我们就称此问题具有最优子结构。使用DP的过程中,我们用子问题的最优解来构造原问题的最优解。例如,在矩阵链乘法问题中,计算矩阵乘法A1*A2*...*An最少运算次数,假设(A1*A2*...*Ak)*(A(k+1)*...*An)具有最少运算次数,那么我们下一步的目标...原创 2018-12-16 18:25:00 · 257 阅读 · 0 评论 -
HDOJ1016 非递归DFS
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1016题目大意:输入一个数字n,输出1到n所有数字组成的序列,每个序列中每个数字出现有且仅有一次。相邻两个数字的和为素数,最后一个数字和第一个数字的和为素数。按照字典序来输出所有可能的结果。所有可能的结果都要以1开头首先,本题中如果调用STL中的next_permutation方法,随后遍历整个序列...原创 2018-12-11 23:00:18 · 240 阅读 · 0 评论 -
HDOJ1199 Color the Ball 线段树+离散化
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1199题目大意:有编号1,2,3,4。。。。。无限多的球,输入N个命令,每个命令格式为num1 num2 w/b。意思是把num1~num2的所有球涂成白色或者黑色。最后输出最长的白色序列。显而易见这个一个区间查询问题,所以自然而然想到利用线段树来解题。我们首先解决的是线段树区间合并的问题。...原创 2019-01-18 10:31:29 · 257 阅读 · 0 评论 -
HDOJ1156 线段树
这道题做的确实太过于艰难,网上的解答基本都写得很简略,直接就把解答代码贴上去了,综合看了很多解答,在加上了一些自己的思考,总算把这道题攻克了。题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1156题目大意是:输入n以及n个点的坐标,Stan任意选一个点做竖线,随后Ollie在被Stan的竖线穿过的点中,选一个点做横线,两个人的线将平面分成四个...原创 2019-01-09 17:03:50 · 166 阅读 · 0 评论 -
hdoj1044 Collect More Jewels BFS求最短路径+DFS求解
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1044题目大意:迷宫用一个二维数组表示,'@'表示起点,'*'表示障碍物不能到达,'.'表示路径,'<'表示终点,’A'~'J'表示宝石,宝石的价值之前输入。每一秒只能上下左右移动一步。求在规定时间限制内可以走出迷宫,拿到的最大的宝石价值。注意这道题每个位置是可以反复通过的。我一开始的思路...原创 2019-02-01 14:10:39 · 289 阅读 · 0 评论 -
快速幂求模算法学习笔记
快速幂求模算法适用范围:求解(a.^b)%c。并且当a.^b超过int 或long int范围的时候也可以快速求出。快速幂求模的引理:乘积求模等于乘数分别求模相乘,结果再求模代码://a.^b % mint modul(long long a,long long b,long long m){ int result=1; a=a%m; while(b&...原创 2019-02-09 16:07:59 · 350 阅读 · 0 评论 -
HDOJ2602 01背包问题以及WA的坑
题目大意很简单,一共有N种骨头,每种骨头有不同的体积和价值,书包的体积为V,在装入骨头不超过书包体积的前提下,使得放入书包骨头的总价值最大。首先输入T,一共有T组数据,接着输入N和V,分别代表骨头的种类数与书包的容积、接着输入value[1]-value[N],每个骨头的价值,最后输入volume[1]-volume[N],每个骨头的体积。典型的01背包问题。设置数组f,f[i]表示书包容...原创 2018-08-25 20:52:28 · 396 阅读 · 0 评论