- 博客(41)
- 收藏
- 关注
原创 练习题 更小的数
解题思路:反转一段连续的子串,属于连续一段元素的群体关系,可以使用滑动指针,但是求的不是最优解而是所有解,所以使用动态规划。所选取的子串的状态由起始字符位置和终止字符位置决定,所以用dp[i][j]表示:起始字符位置为i,终止字符位置为j,这段字符串中共有多少种方案。其中当i==j即起始字符和终止字符位置相同时,方案数为0,除此之外,dp[i][j]=dp[i+1][j]+dp[i][j-1]-dp[i+1][j-1];
2024-01-22 14:12:50
954
原创 练习题 有奖问答
将大问题拆分成做到哪一道问题这种小问题,每种小问题又根据得了多少分划分成更小的问题,每种情况存储的就是可能的情况数,即dp[i][j]表示做完第i题共得了j*10分时可能的答题情况有多少种,除了dp[i][0]是dp[i-1][0]+dp[i-1][1]+...dp[i-1][min(i-1,9)],其余的dp[i][j]=dp[i-1][j-1]。解题思路:画出递归树,每一道题都可能答对或答错,即每一道题都有两种状态,可以使用。,一道题一道题看,这一道题基于前面所有题的答题情况再加两种。
2024-01-21 22:50:51
449
原创 知识点 动态规划
回溯的时间复杂度为指数级,因为重复计算了某些结果,容易超时。6.时间复杂度=状态个数*单个状态计算所需时间=->递推(可以把空间复杂度简化为O(1))动态规划把递归的计算结果。2.核心逻辑和递归一样,把大问题拆成。4.注意数组定义,分清是。3.盘逻辑时,可以借助。下来,再遇到时直接用。计算结果=记忆化搜索。
2024-01-21 20:21:14
390
原创 练习题 幸运数
小蓝认为如果一个数含有偶数个数位,并且前面一半的数位之和等于后面一半的数位之和,则这个数是他的幸运数字。例如 23142314 是一个幸运数字, 因为它有 44 个数位, 并且 2+3=1+42+3=1+4。解题思路:对逻辑进行优化,利用空间换时间,增加两个二维数组,记录前面位数之和各种和的可能个数和后面位数之和各种和的可能个数,二者相乘并相加,得到结果,不会超时。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。,容易想到,但会超时,适合填空题。
2024-01-21 19:55:20
545
原创 练习题 平方差
解题思路:根据评测数据范围,可知该题属于高精度运算,用数组来模拟计算过程。算平方差需要先算两个乘法,再算减法,注意高精度加减乘除法的模拟运算过程。
2024-01-21 11:33:15
372
原创 知识点 高精度运算
int是一个机器字长,在32位机器上是32位,则表示范围是[-long long是两个机器字长,表示范围是[-存储,然后利用0的ASCII码值(48),转换为。4.其实就是模拟加减乘除每一步的过程。),这类数据被称为高精度数或者大数。-1],可表示的最大整数不会超过。-1],可表示的最大整数不会超过。2.适用于需要表示的。
2024-01-20 18:13:22
375
原创 待解决练习题 气球半径
解题思路:两个相碰气球中间的气球后面一定也不会碰到,可以直接删掉,故可以利用改良后的单调栈。测试情况:5个测试用例通过了第1个,有3个测试用例超时了,还有1个测试用例显示答案错误。
2024-01-20 17:24:59
347
原创 练习题 将x减到0的最小操作数
解题思路:题目中的移除最左端和最右端的元素,本质上就是两端两段连续元素的群体关系,可以使用改良后的滑动窗口(同向双指针)。先确定从右端向左最多可以取几个元素,确定右指针的初始位置,然后循环左移左指针(左端取几个元素),右移右指针(右端少用几个元素),找合理解。注意无解的可能情况有两种,一种是拿的值加起来大于x,另一种是都拿了也不够。
2024-01-19 17:24:49
313
原创 练习题 替换子串得到平衡字符串
解题思路:替换一个子串其实就是改变一段连续元素的群体关系,故使用滑动窗口(同向双指针)。注意当舍去最左侧元素且该最左侧元素变化了的时候,新生成的子串可能仍成立,因为剩余子串中仍可能含有该元素但是未变。注意:将一个数组的所有元素复制到另一个数组中,可以使用copy(begin(nums1),end(nums1),begin(nums2));
2024-01-18 21:44:02
375
原创 练习题 拼接最大数
解题思路:要求的最大数的位数一定,需要从两个数组中选数,所以需要用分治考虑不同分配的情况。在每种分治的情况下,可以用改良后的单调栈来选取每个数组中要选取的数,要尽可能先选取更大的数(栈顶的元素要更小)且要保证单调栈中最终的元素个数。注意:字符串->整型:to_string(string str);to_string()不能将字符转换为整型,如遇字符,需要先用string(1,char c);将字符转换为字符串。整型->字符串:stoi(int i);
2024-01-18 12:46:17
378
原创 练习题 删除有序数组中的重复项
解题思路:数组是有序的,所有重复的元素都只在一起,其实就是找上一个不等于自己的元素,可以利用单调栈,从左到右遍历数组,最后单调栈中的元素不重复且从栈底到栈顶从小到大,将其弹出重新赋值给数组,然后将数组反转,新数组的长度就是所求解。注意:STL中的vector类型有一个clear方法,可以用来清空 vector 中的所有元素,使其变为空 vector。
2024-01-17 14:16:39
355
原创 练习题 最大字符串配对数目
解题思路:抓住题目特点,字符串数组中的字符串均为2个字符,可以先将字符串全变为有序的,再对数组排序,找相邻元素是否有相等的,即为匹配的。
2024-01-17 13:29:31
333
原创 练习题 最大连续1的个数III
解题思路:题目求翻转后连续1的最大个数,属于连续一段元素的群体关系,可以使用滑动窗口(同向双指针),每次尝试固定左指针,借助上一个左指针得出的值,推断右指针。
2024-01-17 13:05:04
306
原创 练习题 去除重复字母
解题思路:字母组成的字典序最小,本质就相似于最小整数,所以其实就是要尽可能把这个元素放在上一个比它小的元素的后面,可以使用单调栈。但注意,这道题目中,所以元素都必须至少出现一遍,所以需要先提前遍历一遍记录各个元素总数,以便之后判断后面相同的元素还有几个。本题需要灵活使用单调栈,要出栈的元素应该大于当前元素且之后还会再出现才行。注意:全局变量有默认的初始值,如0、false、nullptr等,可以不用声明时赋值。
2024-01-16 17:53:10
357
原创 练习题 删除链表的倒数第N个结点
解题思路:链表具有搜索单向性,要删掉倒数第几个节点,可以遍历一遍链表,知道链表的节点总数,然后确定删除的节点的位置。可以辅助一个指针,指针2每次走两步,指针1每次走1步,指针2到终点时指针1在半程,计算出位置后,判断从头指针开始找删除节点方便还是从指针1开始找方便,从而节省时间。,指针2先走n步,然后指针2和指针1再一起向后走,直至指针2遍历结束指向空,此时指针1在指针2前n个结点的位置,即倒数第n个结点,删掉指针1即可。给你一个链表,删除链表的倒数第。个结点,并且返回链表的头结点。
2024-01-16 11:12:28
343
原创 练习题 删除排序链表中的重复元素
解题思路:链表无法随机查询,查询时只能单向从左到右,题目要排除所有重复元素且链表连续,即排除所有连续重复元素,属于连续一段元素的群体关系,适用于滑动窗口(同向双指针),这里适合先试固定左指针,然后判断关系右移右指针。注意所有重复元素都要删掉,一个不留,所有需要一个指针记录左指针前面的指针,以便将第一个重复的元素也删掉。还需要注意头指针head的元素是否是重复元素之一,以便及时修改头指针。注意:先判断左指针再判断右指针的时候,里层循环除了要判断关系,还需要判断右指针是否为空,且需要先判断右指针是否为空。
2024-01-15 13:28:23
330
原创 练习题 乘积小于K的子数组
解题思路:题目求连续子数组的乘积相关的问题,属于连续一段元素的群体关系,适用于滑动窗口(同向双指针),移动左指针时输入不满足条件的进入循环移动左指针,满足条件时跳出循环右移一位右指针。
2024-01-15 11:39:17
390
原创 练习题 无重复字符的最长子串
解题思路:题目求最长子串长度,属于连续一段元素的关系,适合使用滑动窗口(同向双指针)。用数组c存储各个元素在子串中的使用次数,利用ASCII码换算下标,在字母、数字、符号、空格中,空格的ASCII码最小(32),ASCII码最大的符号的ASCII码值为126。注意:命名时尽量不要使用count,会和STL中的count撞名。cin不会读取空格,它只会读取空格前面的内容,其余内容丢弃。想读取整行内容时使用getline(cin,s),位于头文件<string>。
2024-01-15 11:23:40
357
原创 练习题 长度最小的子数组
解题思路:题目求连续子数组和大于等于目标值的最小长度,是一段元素的整体关系,且该整体关系增加一个元素会使整体值增大,减少一个元素会使整体值减小,适合使用滑动窗口(同向双指针)优化时间。使用时,先暂时确定右指针的位置,然后遍历左指针。注意条件:左指针要小于右指针。
2024-01-13 19:29:51
354
原创 知识点 滑动窗口(同向双指针)
但是二重循环的时间复杂度不一定为O(n^2),因为数组中每个元素至多被遍历两回,所以滑动窗口的时间复杂度为O(n),空间复杂度为O(1)。数组的子数组的和或乘积,子数组如果加一个元素就会导致和或乘积增大,如果减一个元素就会导致和或乘积减小。将子数组中最左侧的元素剔除。右指针右移,向右再合并一个元素到子数组。,循环便利左指针(满足要求或不满足要求二选一)while 循环遍历右指针。3.同向双指针的代码中存在。4.适用于每次枚举结果具有。1.本质其实就是借用。
2024-01-13 19:06:24
324
原创 练习题 有效三角形的个数
解题思路:合理的三角形两边之和小于第三边,判断是否是合理三角形的时候只要判断最长边为第三边的情况就可以,求的是三角形的个数,可以利用两次双指针优化查找时间。首先确定可能的最长边,然后确定可能的另两条边。注意:一定要先审清题意,明确到底什么是合理情况!!!
2024-01-13 16:24:51
362
1
原创 练习题 最大矩形
解题思路:这道题目涉及二维数组,假设共有rows行,可以拆解成rows个问题,分别以每一行为底,以第一行为顶,可以拆解成rows个柱状图中最大的矩形的一维问题,每次调用单调栈,找两侧更矮的柱子即可解决问题。
2024-01-13 11:40:08
387
1
原创 练习题 盛最多水的容器
解题思路:最后答案涉及到两个垂线的相对关系,容易使用暴力解法。因为最大存水量涉及两根垂线之间的距离(下标差)和两根垂线中的最小值,所以在变换时,需要保证下标差和垂线中最小值至少有一个是增大的。可以使用双指针优化时间复杂度,使两个指针相向移动,下标差是减小的,所以移动更小垂线,并需要保证移动方向上该垂线必须大于最小垂线高度才有必要判断,否则直接跳过该情况(注意并不是直接退出)。
2024-01-11 16:57:58
297
原创 练习题 统计和小于目标的下标对数目
解题思路:本题不难看出可以使用暴力解法判断两数关系,可以使用双指针优化时间。先对数组排序,然后用双指针减少对合理情况的判断次数,并排除掉不可能的情况,相当于剪枝。注意:使用双指针算法,一定要保证数组有序。
2024-01-11 12:07:16
378
原创 练习题 柱状图中最大的矩形
解题思路:求最大面积其实就是找左右两侧有多少柱子是高于这根柱子的,其实就是找左右两侧第一个低于这根柱子的柱子,本质就是查找上一个更小值和下一个更小值,可以使用两次单调栈分别找左右两侧的第一个更低的柱子。注意因为第一次找左侧宽度的时候算上了这根柱子的宽度1,第二次找右侧宽度的时候注意-1,以减去这根柱子的宽度,防止重复计算。因为要求宽度所以单调栈中存储下标更方便。
2024-01-11 11:48:28
323
原创 练习题 四数之和
解题思路:该题目不难看出暴力解法,可以使用双指针优化,四个元素用三次双指针,第一次双指针判断数1可能的位置,第二次双指针判断数2可能的位置,第三次双指针判断数3和数4可能的位置,时间复杂度为O(n^3)。使用last1、last2、last3记录数1、数2、数3上次的数值,防止重复。注意:防止整数溢出的情况,虽然每个整数都未超过int的范围,但是相加后可能会超过int的范围,注意类型转换。在C++中,整数相加后的结果类型由操作数的类型来确定。如果你将两个整数相加,它们的类型决定了结果的类型。
2024-01-10 20:57:30
439
原创 练习题 链表中的下一个更大节点
解题思路:题目要求查找下一个更大节点的值,属于找下一个更大值的问题,可以使用单调栈解决。因为题目所给的数据结构为链表,所以只能从左向右应用单调栈,单调栈中存储的是尚未找到下一个更大值的节点值。从头到尾遍历链表,相当于每次尝试该节点值是否是左侧某个节点的答案,找到答案的弹出单调栈。链表遍历结束后,单调栈中剩余的节点对应的答案即为0(没有下一个更大值)。注意:ListNode* node;
2024-01-10 19:29:06
356
原创 练习题 最接近的三数之和
解题思路:求最接近的解,容易想到暴力解法,可以使用双指针进行剪枝,排除掉不可能的一系列情况,优化时间。依旧是两次嵌套使用双指针算法,最外层的第一层双指针判断最小数可能的位置(自己事先排序),不可能的位置直接跳过,内层第二次双指针算法在第一次排除的基础上,用两个指针下标对每个元素进行一次判断就可以,总体的时间复杂度为O(n^2)。
2024-01-10 10:24:53
354
原创 练习题 三数之和
解题思路:求解三数之和,可以类比两数之和,可以使用暴力解法判断三个数的关系,可以使用“双指针”优化时间。需要使用多次双指针,本题一共需要两次。将数组排序后,第一次双指针判断最小的数可能是哪个,直接排除不可能的最小的数;第二次双指针判断第二大和最大的数可能是哪个。共需要三个指针下标,第一次双指针判断时,如果最小数加上最大两数小于0,则右移最小数指针,若大于0,则再进行第二次双指针,判断区间就是[i+1,n-1],若最小数加上紧挨着的右边的两个数大于0,则不可能还有答案了,可以直接跳出循环,输出结果。
2024-01-09 21:40:19
343
1
原创 知识点 相向双指针
8.在解决三个或多个元素的问题时,利用了整体的思想,将多个元素视为一个整体,多次判断,多次移动,如先判断(元素1)和(元素2、元素3)的关系,移动指针,再判断(元素2)和(元素3)的关系。2.算法思路:将数组有序排列,初始时,双指针分别位于“最大”和“最小”的元素,然后判断两个指针哪个移动。5.每个元素相当于指针指一遍,只需要几个变量而已,时间复杂度为O(n),空间复杂度为O(1)。1.基于数组等有序的特点,优化暴力解法,用O(1)的时间做O(n)的事,提升算法的执行效率。
2024-01-09 17:24:43
409
1
原创 练习题 股票价格跨度
解题思路:求解小于等于当前元素的连续元素个数(跨度),其实就是一直找到上一个更大的元素的下标,用单调栈解决。注意求解过程中,可能出现前面所有元素均小于当前元素的情况,该情况下,单调栈最后会变成空,可能导致最后结果出错。对此,先提前在栈中压入一个无穷大(或无穷小,视具体题目而定)的元素,避免单调栈被弹空无法执行while(!stk.empty())中的else语句的情况。pair<...,...,......>其实就是STL中事先定义好的结构体,用于表示有序对。
2024-01-09 16:16:57
335
1
原创 练习题 商品折扣后的最终价格
主要思路:单调栈。注意单调栈的单调性究竟是单调递增还是单调递减的,要让单调栈的循环判断有意义。如,要找下一个更小的元素,则单调栈从栈顶到栈底应该是递减的才有意义,栈顶一直是离得最近的,往后依次变小,没有必要依次变大。reverse()方法使用需要#include<algorithm>;
2024-01-08 20:05:40
345
原创 练习题 接雨水
求解,前缀从左向右取上一个高度和当前柱子高度的更高值,后缀从右向左取上一个高度和当前柱子高度的更高值,最后的实际高度就是前缀和后缀中的更小值。优化空间,前后两个指针一起开找,指针指向的高度更小的那个答案可知,然后移动,高度更高的那个指针先不动,循环判断直至找出所有答案,时间复杂度为O(n)。上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
2024-01-08 15:31:07
296
原创 知识点 单调栈
4.实现时,比栈顶小(大)的就放入,比栈顶大(小)的就弹出栈顶,循环判断栈顶,注意元素和栈顶元素相等的情况(视实际题目要求而定)。因为每个元素顶多入栈一次,出栈一次,所以T(n) = O(n)5.实际应用时应注意反向思维:答案可能不存在单调栈内,而是每次弹出的元素。2.单调栈的主要思想:及时去掉无用数据,保证栈中数据元素。10.缺点:虽然不超时,但是时间上和空间上也不是最优的。存还未找到答案的元素。情况①:上一个更大(小)元素。情况②:下一个更大(小)元素。1.单调栈的两个特点:①先进先出 ②单调性。
2024-01-08 14:22:50
339
原创 力扣 队列中可以看到的人数
1.C++中std提供了reverse() ,实现元素序列的反转,可以反转vector、string等,如reverse(vector.begin(),bector.end());2.<stack>头文件提供了数据结构stack,实现了栈的一些基本功能,声明方法:3.不能像数组一样使用下标访问栈,只能通过top()访问栈顶元素,不能随机访问。4.stack的常用方法:①push()②pop()没有返回值③top()返回栈顶元素④empty()返回true或false⑤size()
2024-01-08 12:11:48
820
原创 语法进阶 图形排版
1. 该工具会按照图片顺序,在宽度 M 以内,将尽可能多的图片排在一行。例如在 M=10 的纸张上依次打印 3x4, 2x2, 3x3 三张图片,则效果如下图所示,这一行高度为 4。2.如果当前行剩余宽度大于 0,并且小于下一张图片,则下一张图片会按比例缩放到宽度为当前行剩余宽度(高度向上取整),然后放入当前行。例如再放入一张 4x9 的图片,由于剩余宽度是 2,这张图片会被压缩到 2x5,再被放入第一行的末尾。小明需要在一篇文档中加入 N 张图片,其中第 i 张图片的宽度是 Wi,高度是 Hi。
2024-01-05 10:13:55
362
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人