- 博客(16)
- 收藏
- 关注
原创 回文串系列总结
转移方程: 判断 s[i] 和 s[j] 是否相等 ,不相等的话肯定不是回文串,相等就要做判断了, 1.如果说长度 <=2 ,那么已经构成回文串了, 2. 若是 i j 夹住的那个序列也是回文子序列,那么 i j 夹住的也是回文子序列。若 s[i] == s[j] , 那么 直接加入即可 dp[i][j] = dp[i+1][j-1] + 2;注意每一个循环的起始值, j从i+1开始是因为若j不为i+1下面的dp[i+1][j-1] 会越界。那么 dp[i][j] 就代表 i j 中最长的回文串长度。
2024-06-04 17:40:54
342
原创 Leecode 134 加油站
假设从0站点出发,往后依次遍历,收集到一个站点时所剩余的油rest,若rest >0 则标识可以顺利到达那一站,若是rest<0则表明无法到达这一站,假设这一站是i ,那么说明[o,i]之间,sum(cost[i]) > sum(gas[i]) , 那么这个区间中的任何一个站点作为起点,到i站时都会因为rest<0 而无法到达i站 ,(因为前面已经知道中间的站能够到达,所以0-k之间的rest > 0 , 小于0的数减去大于0的数肯定小于0,所以在rest <0 时,将测试的下一站设置为i+1.
2024-05-22 23:53:44
189
1
原创 回溯算法总结 分割篇
那么如何切分一个序列呢, 在for循环中,我们将i的初始值设置为 startindex , 然后让i往后走, [startindex , i] 作为一个切分的序列,每切分一个序列要判断是否符合回文串的规则,若符合,则放入path集中,进入下一层递归,递归时使 startindex 为 i+1 ,从当前分割末尾的下一个位置继续分割。切割为四段的时候,那么.号为3,这也就标识了已经成功切割出一个符合条件的ip地址了。分割问题 是对一个序列进行切分的过程,切分出的符合的序列则放入结果集。
2024-05-22 17:20:21
242
1
原创 回溯算法总结 -组合篇
假设存在两个相邻的相同元素, 那么在同一树层中 它们表现为nums[i] = nums[i-1] ,在同一树层中,nums[i-1]会比nums[i]更先被遍历到,所以 当nums[i-1] 在本层进入递归的时候, used[i-1]为true , 而当它从递归返回到本层的时候,由于回溯, 它会被设为false ,所以,若 (nums[i-1] == nums[i] && used[i-1] == false)的时候,代表nums[i-1]在本层已经被选中过了,序列后面与它相同的元素都不应该再被选中。
2024-05-22 16:20:36
1641
原创 Leecode 15三数之和
内层的while循环中,循环条件为 left < right,同样的,我们也需要对left 和 right 进行去重,那么如何去重呢,是进入循环时直接去重,还是找到一个三元组以后再去重呢?考虑一个刚开始便是[0,0,0]的三元组,若是再while循环刚开始对它进行去重的话,会导致left >= right ,从而漏过了这种情况,所以我们需要在找到一个三元组后,再进行去重。用双指针法,for循环中 , left = i+1,right = nums.size() -1;Leecode 15 .三数之和。
2024-05-17 14:29:51
285
原创 链表第二章
设置两个指针,首先分别指向虚拟头结点和head结点,再根据固定的顺序变换指针的指向。leecode 24 两两交换链表中的节点。leecode 19 删除倒数第n个结点。
2024-05-09 19:38:03
225
1
原创 数组part2
j 往前移动,当区间内的和大于target的时候,记录区间长度,并尝试减小其长度,使得i往后移动,并对sum执行减去nums[i]。循环往复,直到j到达终点。给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix。这是一题蛮经典的模拟题,注意每次都是左闭右开,顺时针方向转一圈。双指针法是比较两端的值,因为平方以后最大值只会在两端出现。双指针法,i代表取的子区间的起点, j是取的子区间的终点。leecode 977.有序数组的平方。
2024-05-07 19:20:19
155
原创 打卡第一天 , LC704二分查找, 和LC27移除元素
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。接下来是双指针法的解法。
2024-04-17 16:05:28
773
1
原创 leecode 93 复原IP地址
首先,组成一个ip地址最少需要4个数字,最多12个数字,若输入的s的长度小于4 或者大于12 ,则必定不能组成合法的ip地址。这道题中如何判断数位是否是快乐数呢,哈希表来解决,题目中说了变不到1的数会无限循环,那么在循环的过程中一定有一个sum是曾经出现过的,若有出现过的sum,则表示这个数不是快乐数。使用unordered_set, 这是一个底层由哈希表实现的集合,每次计算出一个sum,在set中查询是否有记录的值,若没有,插入这个sum,若有,则表示这个数不是快乐数。首先,先复习一下对数位的操作。
2024-04-09 13:26:20
600
原创 重新开始之快排
好像自从上了研究生就没写过快排了 ,今天照着印象里的方法用c++写了一个,代码实现一定不算优雅,但是逻辑应该是清晰的。快排是一种在一般情况下性能稳定的排序算法,在排序序列基本有序的情况下会退化成O(n^2)的效率。递归应该遵循三步的方式来写, 首先要想递归的退出条件,不然会陷入无限递归,然后爆栈。ChooseWay用于选择此时应该移动的下标,true为右,false为左。这里的条件是子序列的长度大于等于2时继续递归,小于2即返回。今天就用经典的快排做开头吧。其他的逻辑就不赘述了。用下列程序测试如下结果。
2024-04-08 17:11:13
205
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人