力扣
算法练习,有需求的小伙伴可跟随博主的脚步一道一道刷
居明明
这个作者很懒,什么都没留下…
展开
-
力扣链表之寻找相交节点160
找到一个相交的启始节点的意思是,在这个节点之后所有的节点相连接都是一样的。所以我们要把短的和长的尾巴对齐,从短的开始两个一起对比。也就是说寻找两端数从何时到尾部都是相同的。原创 2023-04-17 21:18:34 · 46 阅读 · 0 评论 -
此文章用来记录刷题
这么一看我做过的题的好少啊?原创 2023-04-17 20:28:34 · 36 阅读 · 0 评论 -
力扣-字符串-kmp
想要判断重复的子串,要获取子串的最长前缀剩下的部分,如果剩下的部分是最小单位比如说ab,abc,可以被整体长度整除,那么我们就可以至少知道最后一位剩下的部分是最小单位长度。同时我们还要判断最后一位是不是符合条件的字符,我们知道这是一个重复子串组合成的串,最后一位如果和子串的末尾不相同的话,其前后缀最大长度必然是0。借用了上一题的next数组,由于上一题的next数组是为了方便求解重复字符串的,所以对于这道题来说这样设计next数组其实并非最优解。以上两个条件同时满足,我们就认为这个字符串是一个重复字符串。原创 2023-01-18 11:23:06 · 48 阅读 · 0 评论 -
KMP大洞真经
兄弟姐妹们,本文博主将以自己的角度来讲解一下kmp。首先本文总纲上篇-kmp思想下篇-next数组。原创 2023-01-16 20:17:38 · 64 阅读 · 0 评论 -
力扣-字符串-左旋部分字符串(像流水灯一样走到后面)
经过分析想要达到题中所给出的效果,我们可以先反转前面几个数,再反转后面几个数,最后一起反转就实现了想要的结果。换个思路分析:全部反转,所想要反转的就到后面了,再分别把前面的反转调正,把后面的反转调正。借用了上一道题中所写的根据索引反转字符串的方法。原创 2023-01-13 22:14:49 · 39 阅读 · 0 评论 -
力扣-字符串-反转字符串中的某几个小片段
先将全部的字符串中多余的空格去掉,包括开头和结尾,还有中间的一个以上的空格变成一个。随后调用倒置函数,分别将每一小块的字符串倒置。然后将整个字符串倒置。原创 2023-01-13 13:34:48 · 55 阅读 · 0 评论 -
力扣-字符串-替换空格
我们总要挑战一下自己,因此我才用了数组扩容+双指针的方法。扩容后的长度可以完美的存入每个元素,一个快指针查找,如果是字符就赋给满指针,如果找到空格,满指针往前走三步,每走一步存入%20的一点点。直到快指针遍历整个数组。说白了就是一个循环,按照charAt(i)字符的方式存入StringBuilder。如果碰到空格就存入%20。注意:字符数组转换为字符串的方法只有,用new关键字创建一个新的字符串并使用数组对其赋值。原创 2023-01-12 21:07:20 · 71 阅读 · 0 评论 -
力扣-字符串-反转字符串
分为前k和k到2k,两个区间去操作,前面的操作都是一样的仅仅需要最后一点进行判断。如果大于k小于2k,那么stark逻辑正常,我们让endk到结尾在添加就好了。最后一点如果小于k,全部反转,那么我们可以让startk到结尾。不需要啥解法,一个循环就结束了。原创 2023-01-12 20:40:10 · 86 阅读 · 0 评论 -
力扣-数组-二分查找
if (nums[middle] > target) right 更新为 middle,因为当前nums[middle]不等于target,去左区间继续寻找,而寻找区间是左闭右开区间,所以right更新为middle,即:下一个查询区间不会去比较nums[middle]。我们可以设置一个查找索引的函数,采用了最简单的顺序查找,查找到距离target的索引,返回插入位置。本题中寻找到的target都是连续的,那么博主想到的最直接的方法是利用普通的二分查找先找到一个满足target的索引。原创 2023-01-01 23:29:59 · 323 阅读 · 0 评论 -
力扣-数组-移除元素-双指针
和上题类似,但是多了一个重复项判断的内容,因此需要改变指针的位置,即第零个元素必存在, 用第一个元素和他判断并赋值在(零+1)位置上,因为慢指针赋值完的元素不再对其进行操作。暴力破解,设置两层循环,每找到一个符合条件的元素就进入深层循环,将所有的元素都往前走一位覆盖掉原来的元素,并且将有效长度size--,将遍历索引i--(因为你需要从覆盖掉的那个元素位置开始判断)。如果快指针找到和val相同的数值,此时慢指针指向到了val的位置停下来,快指针继续走寻找到一个不等于val的值赋值给慢指针所在位置。原创 2023-01-03 21:30:06 · 97 阅读 · 0 评论 -
力扣-数组-有序数组的平方
再上一个帖子的最后也写到了这道题,除了暴力的相乘再排序,我们也可以采用双指针的方法来求解。我们把数组的数分为正数和负数,其中正数的平方位置不用调整,因为他是有序的,但是负数的平方我们需要进行调整。我们可以将他们的平方与正数的平方从最大正数进行对比,直到找到他的位置。下一个 负数的平方必然小于上一个负数的平凡,我们再让其继续和正数的平凡对比找到位置。因为负数部分比如说(-4 -3 -2 -1)也是有序的,且他们的平方是递减的。为了简化操作,我们可以设置一个新数组,让每次获取到的数字按倒序进入数组。原创 2023-01-05 14:56:56 · 105 阅读 · 0 评论 -
力扣-数组-长度最小的子数组-滑动窗口法
设置一个指针从0开始向前走,每走一次都重复判断,将该指针位置的值不断向后相加,直到刚好大于或者等于目标值,将此段相加元素的长度存储下来。窗口的起始位置如何移动:如果当前窗口的值大于s了,窗口就要向前移动了(也就是该缩小了)。指针每进步一次,都会得到一个长度,不断比较这些长度的到最小的值,如果没有的话返回0。窗口的结束位置如何移动:窗口的结束位置就是遍历数组的指针,也就是for循环里的索引。窗口就是 满足其和 ≥ s 的长度最小的 连续 子数组。解题的关键在于 窗口的起始位置如何移动。原创 2023-01-06 10:18:49 · 106 阅读 · 0 评论 -
力扣-数组-螺旋矩阵-循环不变量
这道题并没有用到有多高深的算法,但是需要保证好循环不变量原则,即每次循环的区间能改变,如果每次循环区间都改变,那么我们就需要做无数个判断,这显然是不符合题意的。每一次存储时的开始位置是一个变化的量,第一次从第0列开始,第二次从1列开始......由此我们可以见得在存储一圈后需要给start(开始位置)++每存储一圈时,在下一圈开始存储时,我们可以看到任意一条边上都消失了两个顶点,因此共需要存储n/2圈。注意:如果所给的n是奇数的话,中间会多出一个数,这个数的位置是start结束位置++原创 2023-01-07 21:59:57 · 149 阅读 · 0 评论