![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
D_4_Y_
不后悔且快乐
展开
-
最长公共子序列问题(动态规划)
Q:给定两个字符串s1和s2,求两个字符串的最长公共子序列(例如:s1为abcfbc,s2为abfcab,则最长公共子序列为abcb或abfc,最长公共子序列可以不连续)首先将s1作为行,s2作为列,构建一个二维数组dp,dp[i][j]代表s1字符串中从0到i与s2字符串中从0到j的公共子序列如果s1[0]==s2[0],则dp[0][0]=1,否则dp[0][0]=0由上图我们可以...原创 2019-04-23 14:44:31 · 371 阅读 · 0 评论 -
和为S的两个数字
Q:输入一个递增序列的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和为S,输出两个数的乘积最小的解题思路:查找两个数和为S,没有要求数字连续,因此我们可以采用“首尾指针法”第一个指针指向数组第一个元素,另一个指针指向数组最后一个元素,当它们的和大于S时证明和大了,因此要将尾指针左移减小和的大小;当和小于S时证明和小了,因此要将首指针右移增大和;最后要考虑的...原创 2019-07-20 16:03:32 · 112 阅读 · 0 评论 -
圆圈中最后剩下的数
Q:0~n-1这n个数字围成一个圆圈,每次删除圈内的第m个数字,求圆圈内最后一个剩下的数字解法一:list容器+迭代器解题思路:因为要每次删除一个数字,并且要遍历,因此需要找到一个方便遍历并且删除效率高的容器;这里我们使用list容器,因为它的删除效率高并且支持迭代器,我们用list模拟环首先将n个数字尾插进list中再使用迭代器开始遍历,每次从当前位置走m-1步就到达第m个数字,如果...原创 2019-07-21 16:02:12 · 178 阅读 · 0 评论 -
二叉树的下一个节点
Q:给定一个二叉树和其中一个节点,请找出中序遍历顺序的下一个节点并且返回;注意:树中的节点不仅包含左右子节点,同时包含指向父节点的指针。解题思路:要找出中序遍历顺序的下一个节点,则要首先搞清楚中序遍历的顺序,即先遍历左子树再遍历根节点再遍历右子树要找出下一个节点,分为下面几种情况:情况一:给定节点有右孩子,那么下一个节点则为它的右子树的最左节点(不论该节点是否是根节点,都是一样的)情况...原创 2019-07-21 19:25:49 · 138 阅读 · 0 评论 -
最长回文子串(动态规划)
Q:给定一个字符串s,找到s中最长的回文字串解决思路:动态规划,建立一个数组dp,用dp[l][r]表示s[l,r]是不是一个回文串,如果是则为true,不是就是falses[l,r]代表字符串从下标为l到下标为r的子串,如果s[l,r]是一个回文串,那么s[l+1][r-1]也是一个回文串;也就是说如果dp[l][r]=true,那么dp[l+1][r-1]也为true如果字符串只有1...原创 2019-07-26 19:31:33 · 578 阅读 · 0 评论 -
最长公共子串(动态规划)
Q:给定两个字符串,输出两个字符串的最长公共子串及长度,如果没有公共子串则输出0输入:asd12asfabd1asfba输出:3asf解题思路:首先理解清楚最长公共子串和最长公共子序列的区别;最长公共子串要求子串是要连续的,而公共子序列不要求连续建立二维数组,保存到该位置已经有几个字符串连续相等,初始化为0如果s1[i]==s2[j],那么v[i][j]=v[i-1][j-1...原创 2019-08-05 11:33:55 · 202 阅读 · 0 评论 -
归并排序
一.基本思想归并排序是建立在归并操作上的一个有效排序算法,该算法是分治法的典型应用。将已有的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序;如果将两个子序列合并成一个序列,称为二路归并。二.图解算法步骤排序步骤:递归找到序列的中间位置,将序列分为两部分,直到不能再继续分为止递归排序分成的两部分;具体可以开一个辅助空间,空间大小为要排序的节点个数,对辅助空间进...原创 2019-08-05 20:11:43 · 124 阅读 · 0 评论 -
链表排序(归并+递归)
Q:使用常量空间复杂度在O(n log n)时间内对链表进行排序。解题思路:题目要求时间复杂度最大为O(n*logn),因此我们考虑使用归并排序思想进行排序找到链表中间位置,将链表切成左右两部分;再找到左右两部分的中间位置将链表切断;直到左右部分的链表不能再切分为止;从下至上递归对切好的链表进行排序,即先让子链表有序,再依次向上让子链表间有序,最后使整个链表有序(二路归并)代码实现:...原创 2019-08-06 10:36:11 · 317 阅读 · 0 评论 -
单链表排序
Q:给出单链表L:L 0→L 1→…→L n-1→L n, 将其重新排序为:L 0→L n→L 1→L n-1→L 2→L n-2→…例如:1->4->2->3->5->9排序后:1->9->4->5->2->3解题思路:从题意我们可以发现,排序是按照一首一尾、一首一尾来进行我们可以先找到中间节点,将链表分割为两个部分;再将后...原创 2019-08-06 11:05:54 · 175 阅读 · 0 评论 -
数组中只出现一次的数字
Q:一个整型数组里只有两个数字只出现一次,其他数字都出现了两次,请找出这两个只出现一次的数字解题思路:通过异或相关知识我们可以知道,成对出现的数字异或后结果为0,那么将这组数据一次异或后的结果就是只出现一次的两个数字异或的结果观察异或结果,比特位为1的就是只出现一次的两个数字比特位不同的位,通过移位并与1结果可以找到第一个比特位不同的位根据该比特位是否为1,可以将这组数据分为两组,成对出...原创 2019-07-19 19:57:37 · 97 阅读 · 0 评论 -
走迷宫(广度优先搜索)
Q:给出一个迷宫地图,计算最快走出迷宫需要多少步?输入:每组数据是10*10,由‘#’和‘.’组成的迷宫,其中‘#’代表墙,‘.'代表通路;入口在第一行第二列,出口在最后一行第九列;从任意一个‘.’都能一步走到上下左右的‘.’;输出:每组数据,输出从入口到出口最短需要多少步解题思路:因为要求出最短路径,因此我们很容易想到利用广度优先搜索来计算路径广度优先搜索(BFS):利用队...原创 2019-07-29 15:19:40 · 399 阅读 · 0 评论 -
左右最值最大差(贪心算法)
Q:给定一个长度为N(N>1)的整型数组A,可以将A划分成左右两个部分,左部分A[0…K],右部分A[K+1…N-1],K可以取值的范围是[0,N-2]。求这么多划分方案中,左部分中的最大值减去右部分最大值的绝对值,最大是多少?(给出数组和数组长度)例如:[3,9,1,5,2,0] 6返回:9分析:结果最大差值为9分为三种情况:假如最大值在A[0]位置,那么右半部分则要找...原创 2019-04-29 15:45:47 · 519 阅读 · 0 评论 -
判断一个树是否是另一个树的子结构
Q:给定一个树A和树B,判断树B是否是树A的子结构(约定空树不是任何一个树的子结构)解题思路:用递归的思想如果根节点相同,则继续判断左右节点是否相同如过根节点不同,则递归判断左右节点及其子树代码:定义树的节点:struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode...原创 2019-06-19 16:15:31 · 355 阅读 · 0 评论 -
合并两个有序链表
Q:输入两个单调递增的链表,输出两个链表合成后的链表,使合成后的链表也满足单调递增输入:A:2->4->6->7->10B:1->2->3->8->9输出:1->2->2->3->4->6->7->8->9->10代码:定义链表节点:struct ListNode { int v...原创 2019-06-19 16:41:01 · 105 阅读 · 0 评论 -
二叉搜索树与双向链表(递归)
Q:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。思路:二叉搜索树本身就是一棵有序的树,要转换成一个排序的链表,则就是它的中序遍历,遍历的第一个结点是最左结点定义一个prev指针保存它的前一个结点,调整指针指向画图:| 代码:定义树的结点:struct TreeNode { int val; struct...原创 2019-06-20 20:58:13 · 171 阅读 · 0 评论 -
复杂链表的复制(三步法)
Q:输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head(注意:输出结果中不要返回参数中的节点引用,否则判题程序会直接返回空)思路:首先,复制节点并插入在该节点后面还原原节点的特殊指针指向拆分原链表和新链表...原创 2019-06-21 16:35:59 · 120 阅读 · 0 评论 -
字符串的排列(递归)
Q:输入一个字符串,按字典序打印出该字符串中字符的所有排列,例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab,cba思路:把一个字符串可以分为两个部分,第一部分为字符串的首字符,第二部分为剩下的字符串要求字符的全排列,就是把一个位置的字符依次与后面每个位置的字符进行交换得到新的字符串首先固定第一个字符,求后面所有字符的全排列;而...原创 2019-06-23 17:42:38 · 339 阅读 · 0 评论 -
连续子数组的最大和
Q:给一个数组,返回它的最大连续子数组和例如:输入:{6,-2,-3,8,-15}返回:9方法一:思路:使用动态规划用sum记录当前子数组的和,res记录最大子数组的和如果sum+当前元素的值小于当前元素本身值,证明之前的子数组和对该元素没有贡献,所以从该元素开始重新记录,如果大于当前元素值则证明有贡献,继续向后记录res是当前子数组和与之前记录的最大值中较大的画图:代...原创 2019-06-23 18:07:51 · 109 阅读 · 0 评论 -
整数中1出现的次数
Q:求任意非负整数区间中1出现的次数(从1到n中1出现的次数)例如:1-20之间1出现的次数为:1,10,11,12,13,14,15,16,17,18,19共12次思路:假如给定一个数字为abcde,c为百位的数字,那么要计算百位出现1的次数,我们会发现有三种不同的情况:如果百位数字为0,则百位出现1的次数由它的高位数字决定。例如12012,百位可能出现1的情况有100–199,11...原创 2019-06-27 18:35:26 · 384 阅读 · 0 评论 -
最长递增子序列
一.最长连续递增子序列Q:输入一个数组,求数组中连续递增子序列的最大长度输入:5 ,{1,3,4,2,7}输出:3 (最长递增子序列为{1,3,4})解题思路:题目要求子序列连续,可以从起始位置开始一直向后判断,如果后一个位置大于该位置,则继续向后判断并记录长度;如果出现后一个位置小于前一个位置,那么就不必再向后判断,此时的长度就是以该起始位置开始的连续递增子序列的长度;将长度与...原创 2019-08-11 17:27:38 · 166 阅读 · 0 评论