- 博客(152)
- 收藏
- 关注
原创 leetcodeQ76最小覆盖子串
然后遍历s,如果s的第i个字符在之前的map里面,则减1,当减到为0,则这个字符满足条件,然后如果t里面所有的字符都满足条件,则可以计算结果,长度为right-left+1;之后就是左边界往右走,往右走是map里面的值加一,如果加大某一个字符的map值大于0了,则不满足条件了,right再加。滑动窗口,记录区间【left,right】之间的子串覆盖没覆盖t,就是t里面的元素是不是在区间之内都找到。我们可以将t用map存,这个map不会太大,因为就是大小写字母,key是字符,v是出现的次数。
2024-11-16 22:57:46
368
1
原创 leetcode234回文链表
怎么找链表的中点,快慢指针,快的一次走两步,是慢的二倍,所以快的到头以后慢的就到中点了,但是要区分。比如我们 1 2 3 2 1,只需要两边走到3就可以,但现在必须1 2 3 2 1都走完。递归在函数调用的时候会返回,走到最后一个我们让他和第一个比较。找到中点,然后就后半部分反转(头插法),再比较两个部分。1 2 3 2 1 和 1 2 2 1两种情况的中点。往右走可以通过next,往左通过递归的特性。因为是单链表,没法往回找,可以用递归。因为递归必须一层一层调完。但是递归需要走完序列。
2024-09-21 09:39:25
561
原创 leetcode206反转链表
相当于利用头插法,把A插到新的链表上,而不需要新申请空间。首先不要直接新建链表,而是把以前的利用起来。下面在调整链接是一定注意。
2024-09-19 17:30:54
389
原创 leetcode73矩阵置零
想到的就是需要一个数组来记录是不是这行或者这列是不是有零,然后最后再扫描一遍这个矩阵。借助第0行第0列来记录这个行是不是有0,这个列是不是有0。另外,这个矩阵不大,所以可能有重复的置0应该也没事。
2024-09-19 11:26:45
332
原创 Q239滑动窗口最大值
3 4 2 1,k=3 一开始你维护的是 4 3 2,右移你需要删除3,你怎么找到呢,二分?其实队列里不需要把区间内的都存进去,比如走到4,4是目前最大的,则接下来的移动两次区间的最大值都不可能从4左边找,所以只需要保存4前面的2 3 不需要保存,5 4 3 2 1,如果k = 3,这种都需要保存,因为你每次都舍弃最大的,需要接下来的倒数第二大保存,也就说,队列需要去除比新数小的所有数。此时是第一个窗口,最大值是队列第一个5,,同时因为需要右移删除的是5,所以队列5需要去掉,此时队列为 3 1。
2024-09-18 15:21:36
181
原创 leetcode438找到字符串种所有异位词
其实应该也是双指针,关键是自己没想到两个数组怎么比较大小,其实也是统计字符次数。但是超时,样例太长了。
2024-09-18 10:38:59
315
原创 Q570和为k的子数组
刚开始以为是滑动窗口双指针,但是发现,有负值,那么,如果窗口内的值大于k,左指针右移不一定是使区间的值减小。双层循环,即判断从i开始,往前计算和为k的数量,每次内层循环必须循环到0,因为可能有多个值(因为有负数)假设pre[i]表示 a1,a2,a3…还是因为有负数,所以上面三个子串都可能满足条件。则pre[i] -pre[j] == k。i到j就是满足条件的子数组。
2024-09-17 16:27:28
204
原创 leetcode49字母异位词分组
知道要用hash,但是当时不知道怎么解决字符串的全排列。一个单词可以变成好多单词,我怎么对这些单词枚举呢。结果发现可以sort,那么字母一样的单词一定一样,然后将单词放到hashmap里面,凡是排完序一样的单词都放到一个队列里去。stringToKey就是想法构建一个key,如何把 abc acb cba 映射为相同的key,就是字母和出现的次数。
2024-09-16 10:59:03
330
原创 二分模板澄清
如果我们target是3 ,找这个的左边界,应该找到的是第一个3,即index为2的值,这需要我们找到等于target值的时候还要继续向左找。二分思路不难,但是我在处理细节,即左边界右边界mid值计算的时候,我总是不确定,容易漏选答案和无限循环,特此澄清。这样的序列最简单,即已经排好序,而且无重复值,就是最简单的二分。因为mid是靠左的,如果只有两个值,mid是等于left的。left+1只可能是等于right,不可能大于right。right = mid 而不是right-1。
2024-09-16 09:16:04
284
原创 堆排序Java
5 2 1 根是 5 看看左右孩子有没有比他大的,我们在上边数组中如何确定第一个子树先找5 2 1 呢,我们现在知道的是数组的长度len,知道最后一个元素last = len-1(数组从0开始)这样我们就找到第一个需要调整的子树,下一个的话就是x-1(自己对着上边的树模拟)但是我们发现,就是不管奇数还是偶数,都可以用x=(len-2)/2这个来计算。还有一个易错点,是 怎么判断三个数的大小,怎么找到三个数中最大的。好,如果调整的话,我们第一个应该调整的是最下边,最右边的树,即。就是从下往上进行调整。
2024-09-08 13:54:54
241
原创 快排Java
每一次都会重复判断high,因为上一行代码 array[high] = array[low];所以array[high] >= pivot 一定成立,我就感觉多了一次判断。对于每一次分区调整,上边的代码有点小问题,但是不影响正确性,
2024-09-07 22:15:05
415
原创 leetcode3 无重复字符的最长子串
除了每次有重复的要更新 ,如果abc这种,本身就不会重复,那maxLength就永远不会更新了。比如 abccfga, 最后的a其实是没有重复的,因为在处理cc重复的时候abc都已经舍弃了。left跳转位置对了,但是left之前的在map里面的也应该清空啊。对于 abcc,应该直接加3,所以需要记录位置。left不应该是+1,对于abca,是+1。
2024-08-30 10:38:03
506
原创 Q134加油站
如果新的start是c,c在a-b之间,首先a-c是大于等于0的,c到b加上a-c的剩余汽油值一定是大于等于c到b的,但是a到b小于0,所以c到b也一定小于0。很清晰的可以看到,首先start加油站的left一定要大于0,然后从start开始一直到start-1,currentGas 一定要大于等于0。如果a->b此时currentGas小于0了,则新的start一定从b+1往后找,而不用从a+1往后找。首先找到合适的start。
2024-07-25 15:47:13
252
原创 Q238. 除自身以外数组的乘积
此时的result[i]则不是1,而是之前计算的一边的值。一开始result数组都是赋值1,所以在左右两个指针没有交叉的时候,看了题解,思路是存i左边的乘积和 与 i右边的乘积和。需要三次循环,需要额外空间 left和right数组。right是i右边的乘积(不包括i)left是i左边的乘积(不包括i)当左右两个指针交叉以后,一开始想到的是按位乘。
2024-07-25 10:56:01
270
原创 Q380 O(1)时间获取插入删除元素
insert 其实用得到search,remove也是,当时o(1)想到的是hash set,但是对于random取,随机数相当于获得的是index,根据index获取元素 Set 数据结构不符合。代码报错,是因为我使用了removeList,这个功能是Java jdk21以后才有的,我刚开始写代码用的jdk22,所以有这个提示,但是当我用Java 8 运行时,报错。最后的思路是 用hash和数组存,对于数组删除,可以使用交换的方式。随机获取应该是数组,但是数组搜索和删除不是o(1)
2024-07-24 20:25:02
180
原创 leetcode198 打家劫舍
比如 1 2 3 4 5 可以计算5 + 1, 但是5+1 一定不会是最大。因为你可以5+3+1,即 你在计算sum[3]的时候已经计算了1+3。有点像走楼梯,只是考虑相邻,也就是说你打算偷a[i],那你就不能偷a[i-1]的,然后可以递归的想。如果money[i]表示第i个房间的钱,sum[i]表示此时在第i个房间一共偷到的最多的钱。即 sum[i] = sum[i-2] +money[i];那还会不会隔更多呢,不会的。
2024-06-16 22:18:50
456
原创 leetcode 130被围绕的区域
可以循环边界,找边界的区域(利用深搜),这些都不能被围绕,其余的,能被围绕,应该从"O"变为”X“字符分别是大写的X和大写的O,我把O当成了0。一个区域不能被围绕是这个区域有部分在边界。
2024-06-16 15:06:28
364
原创 Java算法常用技巧
资料:https://blog.youkuaiyun.com/weixin_72499901/article/details/136592073。这个只能处理包装,处理Integer,不能处理int。自己对于列表,数组的初始化还是不太熟悉。citations 是int数组。用数组初始化List。
2024-06-15 18:48:35
271
原创 leetcode 56合并区间
合并就是首先应该按照left左边界排序,排完序以后,如果i的左边界小于等于i-1的右边界,说明有重合,此时这两个可以合并,右边界应该取最大值。我是定义了一个类,存储左右边界,先将数组转化为这个Interval数组,因为我不会二维数组排序。后来学习了二维数组排序。
2024-06-15 16:03:50
397
1
原创 java设计模式
https://www.cnblogs.com/daoqidelv/p/8522502.htmlhttps://www.bilibili.com/video/BV1G4411c7N4/?spm_id_from=333.337.search-card.all.click&vd_source=c2510a8308e08ca451f8213d3efd0250
2024-06-15 15:40:43
188
原创 leetcode274H指数
其实就是找一个数组的h,h的定义是:h个大于等于h的元素,h越大越好将数组从大到小排序,只需要判断index+1和citations[index]的值index+1 代表的是目前有多少个元素,对于下面的例子排序后citations = [6,5,3,1,0]从前往后找。
2024-06-10 20:09:09
423
原创 Java 为什么重写equals方法时一定要重写hashCode方法
hashCode和 equals 有一个协定,就是如果两个对象相等,equals判断为true,如果你只重写了equals,你自己定义了一些逻辑去判断两个对象的相等,比如id 和 name ,如果两个对象的id和name相等则相等,但是因为你没重写hashcode,他原来的计算方式可以看这个。则这两个对象的hashcode不一样,就不满足之前的协定了。下面是一个改写hashCode和 equals 的方法。
2024-06-09 19:35:00
281
原创 55跳跃游戏
其实只需要遍历一遍数组,时刻更新可以最远的index,因为每一个记录的是从此处可以跳的最远步数,所以当index+可跳的步数大于数组长度即为true。
2024-06-03 10:43:46
374
原创 122.买卖股票的最佳时机Ⅱ
把题目抽象低买高卖,如果递增可以先不卖,但是一旦递减,比如第五天和第六天,降低了,应该在第五天卖,第六天买注意特殊情况,如果 1 2 3 4 5这个没有1中的改变,需要单独判断。
2024-06-02 21:27:16
270
原创 使用junit 测试出现0 test classes found in package ‘java‘
报0 test classes found in package ‘java’ 这个错误。使用 shift +alt +f10快捷键以后没有效果。没有可以测试的按钮,找不到测试类。将你的测试类前面加上public。
2023-08-06 11:57:46
761
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人