- 博客(22)
- 收藏
- 关注
原创 算法通关村第5关| hash与队列|Leetcode 232. 用栈实现队列、225. 用队列实现栈、15. 三数之和
map集合中key可以存的是数组元素,这样可以更快查找元素是否出现过。value存下标map集合中get()是取,put是存get()获取对应键的值本题的双指针逻辑相对还比较清晰明了,但是去重的过程有很多容易出错的地方和细节;既然三数之和可以使用双指针法,我们之前讲过的两数之和可不可以使用双指针法呢?答:两数之和 就不能使用双指针法,因为两数之和要求返回的是索引下标, 而双指针法一定要排序,一旦排序之后原数组的索引就被改变了,如果要求返回的是数值的话,就可以使用双指针法了。度也为O(1);
2023-09-30 21:35:20 187
原创 算法通关村第4关|栈 青铜——理解栈手写栈
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](https://img-home.csdnimg.cn/imag。这个根据题目要求设计就好,如果是面试的时候就直接问面试官,top指向到哪里,注意每次入栈之前先判断栈的容量是否够用,如果不够用,可以进行扩容。top有的地方指向栈顶元素,有的地方指向栈顶再往上的一个空单位。本文采用指向栈顶空位置。
2023-09-05 22:42:20 176
原创 算法通关村第3关 黄金|Leetcode 剑指 Offer 39. 数组中出现次数超过一半的数字、136. 只出现一次的数字
除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。方法用于将 Set 集合中的元素转换成数组,并在给定代码中的用法中,通过。数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。类型的数组,其中包含了 Set 集合中的所有元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。,并且传入了一个刚好能容纳 Set 集合元素的数组。——>set集合不存重复元素。,取出数组的第一个元素,也就是只出现一次的元素。,指定了返回的数组类型为。取出数组的第一个元素。
2023-09-01 21:58:39 193
原创 算法通关村第3关|数组与双指针思想(白银)|Leetcode 27. 移除元素、26. 删除有序数组中的重复项、905. 按奇偶排序数组、189. 轮转数组、剑指 Offer 05. 替换空格
举例数组[3,2,2,3],val=3: left=right的时候在数组下标为1的位置出,此时nums[left]!因为当我们对一个字符串进行重复的添加、删除、替换操作时,每次操作都会生成一个新的字符串对象,这会导致大量的内存分配和垃圾回收,并且效率低下。对象则可以避免这些问题,因为它是可变类型,每次操作都是在原有的对象上进行修改,而不会生成新的字符串对象。在删除的时候,从删除位置开始的所有元素都要向前移动,所以这题的关键是。元素的顺序可以改变。,则在下次循环中,继续将right–后的元素覆盖给它。
2023-09-01 21:56:48 248
原创 算法通关村第3关|数组与双指针思想(青铜)——数组基本操作|| Leetcode 896. 单调数列、88. 合并两个有序数组
个元素,以此类推,最后一次循环处理的是倒数第二个元素和最后一个元素。这样可以遍历到数组中除最后一个元素以外的所有元素,而最后一个元素会在循环结束前单独处理。,nums1和nums2的元素数量是固定的,所以排序后最远位置一定是nums1和nums2元素都最大的那个,依次类推,每次都找最大的那个从后向前填就可以了,因为要在有序数组中找到新元素应插入的位置,我们需要遍历已有的元素,当找到第一个大于新元素的位置时,将其赋给。下,循环会遍历到最后一个元素,而这个元素是不需要比较的,因为新元素要插入到已有元素之前。
2023-08-25 00:07:17 74
原创 算法通关村第2关|链表反转的拓展问题|Leetcode 92. 反转链表 II(头插法+穿针引线法讲解) 24. 两两交换链表中的节点 369.单链表+1 445. 两数相加 II
给你单链表的头指针head和两个整数left和right,其中。请你反转从位置left到位置right的链表节点,返回。
2023-08-20 23:56:37 58
原创 算法通关村第2关|链表反转 青铜——终于学会链表反转了| Leetcode 206 反转链表(详细)
反转链表涉及结点的增加、删除等多种操作,能非常有效考察思维能力和代码驾驭能力。另外很多题目也都要用它来做基础, 例如指定区间反转、链表K个一组翻转。还有一些在内部的某个过程用到了反转,例如两个链表生成相加链表。还有一种是链表排序的,也是需要移动元素之间的指针,难度与此差不多。因为太重要,所以我们用一章专门研究这个题目。:给你单链表的头节点head,请你反转链表,并返回反转后的链表。
2023-07-30 23:49:16 140
原创 算法通关村第1关|链表 黄金挑战——链表中环的问题
先按照快慢方式寻找到相遇的位置(假如为下图中Z),然后将两指针分别放在链表头(X)和相遇位置(Z),并改为相同速度推进,则两指针在环开始位置相遇(Y)。),遍历的时候将元素放入map中,若有环发生碰撞。,如果途中相遇,说明该链表有环。,最容易的方法是使用hash(结论很简单,但这是为什么呢?这依旧是链表经典问题。
2023-07-30 20:16:58 156
原创 算法通关村第1关|链表 白银挑战——链表经典问题之两个链表的第一个公共节点(4种方法)
让 p1 遍历完链表 A 之后开始遍历链表 B,让 p2 遍历完链表 B 之后开始遍历链表 A如果这样进行拼接,两个指针遍历长度都是m+n(假设A长度为m,B长度为n),则相当于遍历链表长度相同,就可以让 p1 和 p2 同时进入公共部分,也就是同时到达相交节点 c1。若不相交,也成立,经过几个轮回后,终究会同时走到空指针使得p1=p2,返回null。
2023-07-20 19:37:37 121
原创 算法学习|Day39 动态规划part02|Leetcode 62.不同路径;63.不同路径II
在动态规划问题中,可以采用滚动数组的优化方式于解决动态规划中的空间问题。遍历总是从数组初始化的下一行,下一列开始的,所以i,j一般都是1开始此题跟62.不同路径相似,但也有很多细节,比如初始化的部分,很容易忽略了障碍之后应该都是0的情况。
2023-07-01 19:42:34 499
原创 算法学习|Day38 动态规划|Leetcode 509. 斐波那契数、70. 爬楼梯 、746. 使用最小花费爬楼梯
此题类似斐波那契数遍历初始位置跟if语句中的n小于的那个数相匹配。
2023-06-30 21:56:23 124
原创 算法学习|Day31 贪心算法|Leetcode 455. 分发饼干 376. 摆动序列 53. 最大子数组和
最大和maxSum初始值设为,是为了保证计算出的子序和curSum一定大于等于maxSum所设置的值,从而保证得到正确的结果。考虑一下,如果maxSum的初始值为0,而数组中所有的元素都是负数,那么遍历数组后maxSum的值仍然为0,结果就不正确了。如果将maxSum的初始值设为负无穷,或者比数组中所有元素的最小值还小一些的值,可以保证curSum在遍历过程中取到正数时,可以正确地更新maxSum。要注意起始位置和终止位置如何确定。
2023-06-29 21:58:53 180
原创 算法学习|Day8 字符串|Leetcode 344反转字符串 541反转字符串II 剑指offer05.替换空格 151反转字符串里的单词
是 Java 中的一个类,用于表示可变的字符串。它可以对字符串进行添加、删除、修改等操作,而不产生新的字符串对象,因此不会带来额外的开销。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。在 Java 语言中,字符串都被设计成==「不可变」==的类型,即无法直接修改字符串的某一位字符,需要新建一个字符串实现。因为字符串也是一种数组,所以元素在内存中是连续分布,这就决定了反转链表和反转字符串方式上还是有所差异的。反转链表中,用了双指针方法,所以,反转字符串仍然是用。
2023-06-05 10:26:58 42
原创 算法学习|Day10 栈part01|Leetcode 232 用栈实现队列 225 用队列实现栈
pop() 和 peek()两个函数功能类似,可以单独把他们共用的部分抽象出来构造一个新的函数,比如此题中新创建的dumpStackIn()函数。本题不涉及什么高深的算法知识,就是用两个栈模拟队列的行为;
2023-06-02 18:15:39 58
原创 算法学习|Day7 哈希表part02|Leetcode 454. 四数相加II 383.赎金信 15.三数之和(双指针) 18.四数之和
提出疑问,为什么不只遍历A,得到Map,然后再遍历B,C,D中所有组合的可能性?因为这样的话,时间复杂度和空间复杂度就提升为O(N^3);注意res计数器在加的时候,并不是直觉上的res+= 1因为出现的频率不一定是1,比如说map中储存的是5:3,对应三组AB元组,分别是,A[1] +B[2] = 5,A[2] +B[3] = 5,A[3] +B[4] = 5,然后在C+D中找到了一对相加等于-5的,所以说这样就找到了三组四元组,应该res+3;
2023-05-30 23:03:47 154 1
原创 算法学习|Day5哈希表开启|Leetcode 242.有效的字母异位词 349.两个数组的交集 202.快乐数 1.两数之和
当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。但是哈希法也是牺牲了空间换取了时间,因为我们要使用额外的数组,set或者是map来存放数据,才能实现快速的查找。如果在做面试题目的时候遇到需要判断一个元素是否出现过的场景也应该第一时间想到哈希法!在哈希值比较小,范围可控情况下用数组;数组很大用set;k对应有value的话用map学会用字符下标来映射为数组下标这是本题要学会的集合求交集可以用set集合来去重map集合中key可以存的是数组元素,这样可以更快查找元素是否出现过。
2023-05-30 00:07:31 253
原创 算法学习|Day4链表收尾|Leetcode 24.两两交换链表节点 19.删除链表的倒数第N个节点 142.环形链表 II M
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
2023-05-28 21:43:01 164
原创 算法学习|day3 链表 Leetcode 203.移出链表元素 707.设计链表 206.反转链表
在不使用虚拟头节点进行删除头节点要用while 不能用if删除值相同的头结点后,可能新的头结点也值相等,用循环解决虚拟头节点删除最后返回的是为什么要使用临时指针?操作完链表之后要返回头结点,直接操作头结点会改变其值,故需要定义一个临时指针指向头结点获取第index节点值注意index非法因为index是从0开始的,最后一个位置是size-1;所以最大值index>=size就已经非法了return - 1;addAtIndex(index,val添加节点)第index前size++要注意。
2023-05-27 14:45:43 165 1
原创 算法学习| Day2数组收尾 Leetcode 977.有序数组的平方 209.长度最小的子数组 59螺旋矩阵II
给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。至此,数组部分已经完结,但是对应数组部分的方法仍需要进一步练题深化,目前来说学会了二分查找,双指针法,滑动窗口,模拟法,后续仍需要多加练习!如果只用一个for循环来表示 滑动窗口的起始位置,那么如何遍历剩下的终止位置?不要以为for里放一个while就以为是O(n^2), 主要是看每一个元素被操作的次数,本题关键还是在转圈的逻辑,在二分搜索中提到的区间定义,在这里又用上了。
2023-05-25 17:52:25 150 1
原创 算法学习| Day1数组 Leetcode 704.二分查找 27.移除元素
相向,顾名思义就是从两头开始向中间靠拢,一头一尾定义2个左右指针,因为此题只是要求移出元素后返回新数组的长度,并没有对其中数组内部元素的序列有要求,所以正是因为这一点,本题采用此方法,让右指针先移动到从右数第一个值不为val的位置,之后开始while循环,一个长度为5的数字,最后一个数下标为4,length=5,若**要数组下标在左闭右开区间[left,right)中,则right必须为5,才能使得区间在0。当i为2时,找到了符合要移出的数值,将后面的数往前移动之后是{0,1,2,3,0,4,2},
2023-05-24 16:31:56 297 1
原创 力扣算法之哈希表
当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。但是哈希法也是牺牲了空间换取了时间,因为我们要使用额外的数组,set或者是map来存放数据,才能实现快速的查找。如果在做面试题目的时候遇到需要判断一个元素是否出现过的场景也应该第一时间想到哈希法!
2023-05-02 19:15:16 326 3
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人