- 博客(13)
- 收藏
- 关注
原创 【leetcode】5.最长回文子串
2.定义状态转移方程:由于回文串的定义决定了每个回文串在去掉首尾两个字母后也还是回文串,所以其实每个P(i, j)是否是回文串取决于:P(i+1, j-1)是否是回文串+第i个字母和第j个是否相等,都满足时P(i,j)就是回文串。所以状态转移方程为:P(i. j)=P(i+1, j-1)∩(Si == Sj)3.初始化:所有长度为1的子串都是回文串,所以用 i 来遍历dp[][]时将所有dp[i][i]都设为true。1.定义状态:使用P(i, j)保存原字符串s的第i个到第j个字符组成的子串。
2025-03-08 15:29:41
178
原创 【leetcode】70.爬楼梯
2.定义状态转移方程:dp[i]=dp[i-1]+dp[i-2],爬到第i阶楼梯的最后一步只能是“从i-1阶再爬1阶”或者“从i-2阶再爬2阶”,分别对应了dp[i-1]的所有方法和dp[i-2]的所有方法。3.初始化:初始的dp[0]=1,dp[1]=1,有这两个值就能计算得出之后的所有dp[i]并填入DP表中(DP表是一个数组,存储每从最小的子问题开始逐步求解更大的问题过程中的每个结果)即状态转移方程为:dp[i][j]=max(dp[i−1][j],dp[i−1][j−w[i]]+v[i])
2025-03-08 15:27:59
302
原创 【leetcode】27.移除元素
2.如果在遍历nums数组时想在一次遍历内完成对所有元素的判断以及nums数组修改的话,需要在判定当前元素等于val时移除当前元素时快指针值不变,这样快指针值指向的还是原来的位置但在下次遍历时存放的是下一元素了,若当前元素不等于val则快指针值才变化。目的:对输入的数组进行修改,需要删去其中所有与输入变量相等的元素,最后返回修改后的数组和剩余的元素数量。你的函数应该返回 k = 5,并且 nums 中的前五个元素为 0,0,1,3,4。你在返回的 k 个元素之外留下了什么并不重要(因此它们并不计入评测)。
2025-01-09 22:59:43
830
原创 【leetcode】26.删除有序数组中的重复项
将vector的第一个元素赋给temp将每个遍历到的元素和temp对比,若相同则继续遍历下一个元素,直到遍历到一个和temp不同的元素时,将temp变成这个不同的唯一元素然后将一个初值为零的i记录型nt变量amount++,最后将会返回这个amount;至于对输入向量nums的操作,我想创建一个新向量,在每次temp更新时将temp push_back到新向量中,最后在遍历完nums后将新向量赋值给nums,应该很多人都会采用这个方法吧,虽然这样空间开销会增加。不需要考虑数组中超出新长度后面的元素。
2024-10-18 18:28:40
505
原创 【leetcode】21.合并两个有序链表
3.关于创建一个结果链表的部分,一开始设想的是只需要创建一个新指针result指向结果链表的头结点就可以了,但之后发现还需要一个指针用来指向“当某个输入链表被读取完毕时“的结果链表尾结点,如果移动result到尾结点的话就没办法再找到结果指针的头结点了啊!详细一点的想法大概是这样:创建一个新链表用来存放最终结果,同时创建两个专门指向两个链表的指针用于遍历它们,它们初始都指向各自链表的头节点,在经过比较之后将值较小的结点加入到新链表中,同时该被取走结点的链表对应指针往后移一位,然后进行下一次比较;
2024-10-17 21:41:30
413
原创 【leetcode】20. 有效的括号
同时,对括号组合有效性的判断大概是这样:“最后读到的左括号会尝试匹配最先读到的右括号”,与栈的后进先出规则相似,所以创建一个栈,按字符读取string并以优先数形式存放括号,在读取到左括号时压入栈,在读到右括号时弹出栈顶元素,判断栈顶元素和读到的括号是否为同一类型的括号,若否则return false,是则继续读入下一个括号直到读完所有输入括号;故一开始设置的两个映射就错误了,不需要安排三种括号之间的优先级,只需要设计一个将三种括号的左括号映射成对应的右括号的映射应该就足够了。输入:一个string。
2024-10-15 18:13:55
574
原创 【leetcode】14.最长公共前缀
2.还有一个问题暂时不知道如何解决,在获取范本的第i个字符并和当前正在检视的string的同一位字符比较时如果直接访问范本[i]则会结果出错,但先创建一个char然后将此次用于比较的范本[i]保存到其中再和当前监视string的同一位字符进行比较就没有问题,甚至偶尔运行速度还能达到惊人的0ms太带派了。目的:找到vector中每个元素的共同前缀并输出。编写一个函数来查找字符串数组中的最长公共前缀。输入:一个元素为string的vector。如果不存在公共前缀,返回空字符串。输入不存在公共前缀。
2024-10-14 16:44:21
318
原创 【leetcode】13.罗马数字转整数
在①情况读入字符小于index所指字符时继续往后读,index++,直到读入比当前index所指的更大的字符,然后将这轮读入读到的所有字符翻译成int并相加后存入一个数组,index++;罗马数字转换成阿拉伯数字的规则大概可以如下理解:罗马数字从右往左读就是对应阿拉伯数字的从个位到最高位,在其中遵循着“遇到比当前位大或者相等的数字时需要加入到结果,遇到比当前位小的数字时需要在结果中减去”的规则。通常情况下,罗马数字中小的数字在大的数字的右边。等价于 a = a << b;等价于 a = a >> b;
2024-09-30 21:56:28
755
原创 【leetcode】9.回文数
出错1:由于存放回文数选用的数据结构是char数组而不是vector,所以在初始化时就确定了一个足够大的容量(20)保证能存入大部分测试数据,但在后续求回文数的字符个数时就就不能使用经典的sizeof(整个数组)/sizeof(单个元素),因为回文数一般只占数组的前几位而剩余位都是0;解决办法是:原int型回文数转换成char型时用来移动窗口的index在转换完成后恰好是该回文数存放在数组中的末元素下标+1,也就是这个回文数的字符数量,把它赋值给size。因此它不是一个回文数。是一个回文整数,返回。
2024-09-27 11:39:59
331
原创 【leetcode】3.无重复字符串的最长字串
然后用find(temp_sub.begin(), temp_sub.end(), target)来读取,读到的字符不是重复的就将该字符pushback到temp_sub然后继续读取原字符串中的下一字符,读取到重复字符时clear()然后shrink_to_fit()这个temp_sub,继续读取原字符串下一字符;而子序列是指原字符串删除某些(也可以不删除)字符后剩下的字符保持原顺序不变形成的序列,它不一定是连续的,但出现的字符之间的顺序不能变,可以是空串、可以是原字符串本身。因为无重复字符的最长子串是。
2024-09-20 21:52:30
638
1
原创 【leetcode】2.两数相加
2. 创建两个临时的节点(或者单纯用int)储存这次遍历时两个结点存放的值。4. 每一轮的计算考虑以下因素:两个数字该位的值、上一轮计算留下的进位符号。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。的链表,表示两个非负的整数。它们每位数字都是按照。请你将两个数相加,并以相同形式返回一个表示和的链表。2. 每个链表的头节点是这个数字的个位数。的方式存储的,并且每个节点只能存储。3. 输出的相加结果也按同样的格式存储。1. 用链表按位存储的两个数字。1. 同步遍历两个链表。
2024-09-20 21:50:03
189
原创 【leetcode】1.两数之和
以每个元素为基底和自身位置之后的元素相加,判断该次相加后的结果是否等于传入的参数target,所以两层循环的条件分别设置为(int i=0;i++)和(int j=i+1;j++)即从下标为0的元素到倒数第二个元素轮流当作“基底”,然后基底和它之后的每个元素进行相加,判断是否等于目标。因为 nums[0] + nums[1] == 9 ,返回 [0, 1]。你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。整数,并返回它们的数组下标。你可以按任意顺序返回答案。,请你在该数组中找出。
2024-09-20 21:31:22
152
原创 408计算机考研数据结构2016年统考真题
已知由n(n>=2)个正整数构成的集合A={ak|0<=k<n},将其划分为两个不相交的子集A1和A2,元素个数分别是n1和n2,A1和A2中的元素之和分别为S1和S2。3. 如果输入集合已经排过序了那要考虑的其实只有划分边界的前后是否有重复元素,然后判断除去该重复元素后两侧子集哪个元素更少,将该重复元素全部划入元素更少的子集中。1. |n1-n2|最小->子集1和子集2元素数量尽量接近->将集合尽量均分。2. |S1-S2|最大->子集1和子集2尽量按大小划分->先排序后再划分。S2: 子集2元素和。
2024-09-20 20:53:20
444
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人