- 博客(30)
- 收藏
- 关注
原创 代码随想录算法训练营Day12 | 239.滑动窗口最大值、347.前K个高频元素
用单调队列来实现,把最大值放在出口位置,如果出现了比当前最大元素还要大的元素,就把前面的元素全部弹出,直到队列为空,然后再将新元素都添加到队列中。这样可以保证队列的元素保持单调递减,同时保证队列头部始终是当前滑动窗口的最大值。为什么队列中要存放数组下标的值而不是直接存储数值,因为要判断队首的值是否在窗口范围内,由数组下标取值很方便,而由值取数组下标不是很方便。尤其注意,本题使用的是双向队列,除了队头元素,其余元素都是从入队方向进入的。是滑动窗口的大小,该方法返回每个窗口中的最大值数组。
2024-05-05 21:34:54 986
原创 代码随想录算法训练营Day11 | 20.有效的括号、1047.删除字符串中的所有相邻重复项、150.逆波兰表达式求值
它允许在队列的两端进行插入和删除操作,因此可以像队列一样从一端插入元素(尾部),从另一端删除元素(头部),也可以像栈一样从一端插入和删除元素(顶部)。无论有多少种排列,对不上的情况也就是三种:左括号富余,右括号富余,括号匹配不上,至于做法,我们应该在遇到左括号的时候,往里面添上相应的右括号,当遇到右括号的时候删除栈里相应的右括号,最后如果栈内元素为零,说明符号是顺序相同而且相互匹配的栈先进后出的。如果当前字符是右括号,并且栈为空(没有相应的左括号),或者栈顶的括号与当前字符不匹配,则返回。
2024-04-28 11:22:23 925
原创 代码随想录算法训练营Day10 | 232.用栈实现队列、225. 用队列实现栈
元素出栈指的是从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。在入栈操作中,我们使用了一个辅助队列来保持栈顺序的正确性,并且在需要时交换了主队列和辅助队列的引用。解题思路:定义两个栈,一个入栈一个出栈,由于队列是先进先出的,要想通过栈实现,我们可以再定义一个栈,把输入栈的元素再通过输出栈重新输出,顺序就会和队列一模一样。题目思考:因为队列就像一个管道,怎么进去就怎么出来,所以我们要用两个队列,其中一个负责输出,一个负责储存,这样才能模拟实现栈的功能。
2024-04-27 20:13:32 2476
原创 代码随想录算法训练营Day9 | 双指针总结归纳:
3.链表中,翻转一个链表是用的双指针改变链表指针的指向,直至将链表反转,而找到一个环,是看快指针能否“追上”慢指针,如果有环,则两个指针一定会相遇。1.对于数组而言,数组上的元素不能做到删除,只能进行覆盖,通过两个指针在一个for循环下完成两个for循环的工作,提升了效率。2.字符串中定义两个指针(也是索引下标),分别从字符串的前后进行遍历并交换元素。4.N数之和用的是双指针,用一个for循环解决两个for循环所需要解决的问题。
2024-04-26 22:11:23 249
原创 代码随想录算法训练营Day8 | ● 344.反转字符串● 541. 反转字符串II● 54.替换数字● 151.翻转字符串里的单词● 55.右旋转字符串
这段代码利用了双指针的思想,从字符串的两端开始,逐步向中间移动,交换对应位置上的字符,从而实现了字符串的翻转。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。在确定了要反转的子字符串的起始和结束位置之后,使用双指针法对该子字符串进行反转操作。解释:如果两个单词间有多余的空格,反转后的字符串需要将单词间的空格减少到仅有一个。输入:["H","a","n","n","a","h"]输出:["h","a","n","n","a","H"]输入:["h","e","l","l","o"]
2024-04-25 08:44:11 1172
原创 代码随想录算法训练营Day7 | 454.四数相加、383.赎金信、15.三数之和、18.四数之和
454.四数相加、383.赎金信、15.三数之和、18.四数之和(Java详解)
2024-04-23 23:38:46 685
原创 代码随想录算法训练营Day6 | 242.有效的字母异位词 ●349. 两个数组的交集 ● 202. 快乐数● 1. 两数之和
基础:1.哈希表是根据进行的数据结构,时间复杂度是O(1),也就是通过数组的索引下标,直接访问数组中的元素List, Set, Queue, Map 区别?List(对付顺序的好帮手): 存储的元素是有序的、可重复的。Set(注重独一无二的性质): 存储的元素不可重复的。Queue(实现排队功能的叫号机): 按特定的排队规则来确定先后顺序,存储的元素是有序的、可重复的。
2024-04-22 23:48:07 1115
原创 代码随想录算法训练营Day4 | 24.两两交换链表中的节点、19删除链表中的第N个节点、链表相交、142.环形链表
24.两两交换链表中的节点、19删除链表中的第N个节点、链表相交、142.环形链表 Java详解
2024-04-20 11:20:50 1104
原创 代码随想录算法训练营Day3 | 203.移除链表、707.设计链表、206.反转链表
在循环中,每次都将 cur.next 指针指向前一个节点 pre,然后更新 pre 和 cur 指针为当前节点,temp 指针为当前节点的下一个节点。题目思路:创建一个虚拟头节点以及两个指针,如果遍历到匹配的元素,则跳过这个节点,虚拟头节点的下一个就是真正的头节点,创建虚拟头节点就是预防原来的头节点就是我们需要的节点的这种情况。必须先改变pre的值,再改变cur的值,否则会因为cur的值先改变,pre就无法移动到cur的位置。赋值时,如果需要将虚拟头节点与链表的头节点连接起来,那么是必须要将链表的头节点。
2024-04-19 23:50:09 1100 1
原创 代码随想录算法训练营Day2 | 977.有序数组的平方、209.长度最小的子数组、59.螺旋数组
977.有序数组的平方、209.长度最小的子数组、59.螺旋数组(Java详解)
2024-04-18 11:17:45 2313
原创 代码随想录算法练习Day15:快乐数
把一个数计算后的值放到一个集合中去,如果出现重复出现的数字,则证明出现了环,那就永远不可能会得到1.因为我们要随时检查新的数字是否在以前出现过,所以我们要用集合进行查询,所花费的时间会短于数组。编写一个算法来判断一个数。
2024-04-16 09:10:55 463 1
原创 代码随想录算法练习Day14:两个数组的交集
哈希表是一种高效的数据结构,能够以常量时间复杂度 O(1) 进行元素的查找和插入操作。这意味着无论集合中有多少个元素,查找和插入操作所需的时间都是相同的,因此在大量数据的情况下,首先通过条件语句判断了传入的两个数组是否为空,如果其中任意一个为空,则直接返回一个长度为0的数组,表示交集为空。集合中添加已经存在的元素时,添加操作不会产生任何效果,因为集合中已经存在相同的元素了。最后定义新数组时的取值范围,是集合的size而不是集合的length噢。集合中的元素,并将其逐个赋值给数组。,用于存储数组中的元素。
2024-04-15 22:41:24 520 1
原创 代码随想录算法练习Day13:有效的字母异位词
异位词也就是判断两个字符串中所含的元素是否相同,位置不同也没关系,定义一个数组,因为题目中给出的字符只有小写字母,把字符映射到哈希表的索引下标上,遍历第一个字符串的时候,把出现的字符索引加一,再遍历第二个字符串,把遇见的字符减一,如果这个数组的所有元素都是零的话,就说明两个字符串是字母异位词。这个算法的时间复杂度是 O(n),其中 n 是字符串的长度,因为需要遍历两个字符串。整体的空间复杂度为 O(1),因为使用了一个固定长度的数组。别忘了charAt方法和求长度的括号噢。3.增强for循环语句用来比较。
2024-04-14 13:09:06 416 1
原创 代码随想录算法练习Day12:环形链表
因为快指针每次都走两步,所以快指针走过的节点数是慢指针的两倍,也就是(x+y)*2 = x+y+n(y+z),因为要找的是入口值,也就是图中x的长度,最后化简可得到x = (n-1)(y+z)+z。判断是否有环:定义两个指针,让快指针每次走两步,慢指针每次走一步,当快指针走到环内部之后,慢指针才会进入环内,此时是快指针在追慢指针,但是对于慢指针来说,快指针是一步一步在追它的,所以存在环形结构 话,两个指针是一定会相遇的。2.快指针一定是至少转了一圈才能追上慢指针的,所以n一定大于等于1。
2024-04-13 20:20:50 662
原创 代码随想录算法练习Day11:链表相交
题目:给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null。这段代码的核心思想是通过先将较长链表的指针先向后移动到与较短链表的起点对齐,然后同时遍历两个链表,找到第一个相同的节点即为交点。3.在遍历之前,为了让我们的表达更加清楚,我们可以再次声明让cur指向head。定义两个指针,分别遍历两链表,如果指针有相同的,则说明有相交的节点。2.必须让两条链表比较时的长度是一样的。1.我们要比较的是指针相等而非链表中节点的值相等,
2024-04-12 10:29:26 580
原创 代码随想录算法练习Day10:删除链表的倒数第N个节点
假如要删除倒数第n个节点,则让快指针先走n+1步(+1是为了让慢指针指向被删除节点的前一个),再让快慢指针同时走,当快指针指向空时,慢指针就走到被删除节点的前一个了。要找到删除的节点,就要知道它的上一个节点是什么,我开始的想法是把链表反转过来,直接删除第n个节点,但是这个操作就复杂了,可以直接使用。指针的下一个节点指针指向下下个节点,即删除了倒数第 n 个节点。最后,返回虚拟头节点的下一个节点,即链表的头节点,完成了删除操作。,这样可以确保链表不会因为删除节点而丢失头节点。指针指向链表的头节点。
2024-04-11 09:08:30 679 1
原创 代码随想录算法练习Day9:两两交换链表中的节点
1.注意循环的条件,这里巧妙地将链表个数为偶数和奇数的情况都囊括了,当链表个数为偶数时,如果cur的下一个为空,则停止循环,如果链表个数为奇数时,则还需要同时满足cur下一个的下一个为空才会停止循环,这也是为什么只能用和而不能用或。解题思路:利用虚拟头节点,用引用记录要交换的值,以防止后续找不到相应的节点了。分别保存当前节点和当前节点的下一个节点,即需要交换的两个节点。分别保存当前节点的下一个节点和下下个节点,以备后续使用。,即将交换后的节点连接到链表的后续节点。指针,即交换后链表的头节点。
2024-04-10 16:52:49 756 1
原创 代码随想录算法练习Day8:反转链表
必须先改变pre的值,再改变cur的值,否则一旦cur的值先改变,pre就无法移动到cur的位置。方法反转以当前头节点的下一个节点为起始的子链表,并将返回的反转后的链表的头节点赋值给。其实只需要改变链表的next指针的指向,直接将链表反转 ,而不用重新定义一个新的链表。如果再定义一个新的链表,实现链表元素的反转,其实这是对内存空间的浪费。,将当前节点与下一个节点的联系断开,从而完成了当前节点的位置更新。指针指向当前头节点,完成了当前节点和下一个节点的反转操作。: 这一行将当前头节点的下一个节点的。
2024-04-09 21:47:42 849
原创 代码随想录算法练习Day6:移除链表元素
解题思路:创建一个虚拟头节点以及两个指针,如果遍历到匹配的元素,则跳过这个节点,虚拟头节点的下一个就是真正的头节点,创建虚拟头节点,就是为了应对原来的头节点就是我们需要找的节点的情况。的元素,并返回移除元素后的链表头节点。: 首先检查头节点是否为空,如果为空,说明链表为空,直接返回头节点即可。的下一个节点指向当前节点的下一个节点,即跳过当前节点,实现移除操作。,值为 -1,它的下一个节点指向原来的头节点。: 创建一个指向当前节点的前一个节点的指针。的下一个节点,即移除元素后的链表头节点。
2024-04-07 14:40:06 327 1
原创 代码随想录算法练习Day5:螺旋矩阵II
定义一个新的n*n二维数组,用for循环遍历把数字依次遍历进去,如果n为基数,则手动把最后一个元素输入到二维数组的最中心。这样,通过模拟四个方向的遍历过程,逐步填充数字,最终得到了一个按顺时针螺旋排列的矩阵。为奇数,最后一个循环结束后需要将中心位置的值填入。作为结果矩阵,所有元素初始值为 0。为 0,用于控制循环次数。为 0,用于记录每次循环的起始点。,表示从外向内遍历螺旋矩阵。为 1,用于填充矩阵的数字。这段代码实现了一个函数。,用于生成一个大小为。
2024-04-06 11:12:31 477 2
原创 代码随想录算法练习Day4:长度最小的子数组
题目链接:209.长度最小的子数组卡哥的视频讲解:拿下滑动窗口! | LeetCode 209 长度最小的子数组代码示例:
2024-04-05 22:16:27 205 1
原创 代码随想录算法练习Day3:有序数组的平方
题目链接:977.有序数组的平方卡哥的视频链接:双指针法经典题目 | LeetCode:977.有序数组的平方代码示例:
2024-04-04 23:50:22 748 3
原创 代码随想录算法练习Day2:移除元素
总之,该函数通过双指针的方法在原地修改数组,将不等于目标值的元素移动到数组的前面,并返回移除后数组的长度。但是需要指出的是,当前代码中没有正确处理等于目标值的情况,因此会存在问题。应该在条件判断中增加对等于目标值的情况的处理,例如在遇到。用双指针的思想,定义快慢两个指针,快指针用来寻找新数组的元素 ,新数组就是不含有目标元素的数组,一旦搜索到就将其下标值传给慢指针,慢指针用于指向更新新数组下标的位置。遍历整个数组,逐个检查数组中的元素。的元素,并返回移除后数组的长度。的值,即移除元素后数组的长度。
2024-04-03 10:52:41 613 1
原创 代码随想录算法练习Day1:二分查找
求中间位置的写法相比,可以避免在大数相加时可能导致的溢出问题,同时也更为高效。:二分法要求在查找的数据结构中元素按照某种顺序有序排列,通常是升序排列。:二分法适用于在有序数组或列表中查找目标元素是否存在,或者查找目标元素的位置。:二分法要求能够通过索引或指针以O(1)的时间复杂度访问数组或列表的任意位置。二分法(Binary Search)是一种在有序数组或列表中查找目标元素的算法。2.在写范围的时候,是根据是否包含数组的边界元素来确定的。示例1(左闭右闭写法):。表示当前搜索范围的长度,
2024-04-02 21:37:20 1194 1
原创 Java啤酒问题:啤酒2元一瓶,凭4个盖子或者两个空瓶可以换一瓶,请问10元可以喝多少瓶?
先求出本金可以买多少瓶,再分别计算手中啤酒瓶和盖子的数量,折算成钱,继续“买”啤酒,利用递归的思想解决问题。
2024-04-01 16:12:45 259
原创 Java迭代器
迭代器是用来遍历集合的专用方式(数组没有迭代器),在Java中迭代器的代表是Iterator。为什么不用for循环遍历呢?因为collection集合体系中包含List集合和Set集合,List系列集合有索引,但是Set系列集合都是没有索引的,所以要用迭代器进行遍历。
2024-03-28 11:30:33 197 1
原创 Java中的Lambda
1.Lambda表达式的作用是啥:**简化代码:**Lambda表达式可以让你用更简洁的方式编写代码,避免了使用匿名内部类时的冗长的语法。**函数式编程:**Lambda表达式使Java具备了函数式编程的能力,可以更方便地使用函数式接口,并进行函数式编程的思想。**增强API:**Java 8引入了大量新的API,这些API广泛使用了Lambda表达式,使得API更加灵活和易于使用。
2024-03-26 16:57:46 744 1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人