自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(18)
  • 收藏
  • 关注

原创 代码随想录算法训练营第十天 | 232. 用栈实现队列、225. 用队列实现栈

出“栈”时,将队列除了最后一个入队的元素以外的元素全部移出队列,再重新入队,这样,执行poll操作时队首元素就是最新一个入“栈”的元素了。将前面的移出队列再重新入队的操作写成一个方法,在出“栈”和获取“栈顶”元素时调用。获取“队列顶”与出“队列”的操作差不多,只是最后将pop换成了peek,因此可以将前面的操作写成一个方法,在出“队列”和获取“队列顶”时调用。出“队列”时,将入栈的元素移动到出栈中,这样最外面的元素就是最先进入“队列中的元素了”,再对出栈正常进行pop操作。入“队列”时与入栈操作一样。

2024-02-17 16:41:32 209 1

原创 代码随想录算法训练营第九天 | 28. 找出字符串中第一个匹配项的下标、459. 重复的子字符串、双指针回顾

本题是KMP算法的一个最简单的应用。KMP算法主要的用处即为找到匹配字符串的下标。我们用题目中的haystack和needle字符串来讲解KMP算法的原理。给needle字符串建立一个前缀表,存储在每个字符之前(包括该字符)最长的相同前后缀的长度。之后再用这个前缀表来匹配needle字符串,当已经匹配了一段相同的字符串,突然匹配到一个不相同的字符时,可以倒回到不相同的字符的前一个字符的最长相同前缀之后的一个位置。为什么是这个位置呢?

2024-02-14 21:08:25 646 1

原创 代码随想录算法训练营第八天 | 344. 反转字符串、541. 反转字符串 II、卡码网54. 替换数字、151. 反转字符串中的单词、卡码网55. 右旋字符串

将上一题的答案写做一个单独的方法,在循环中调用即可,直接在参数中加入左指针和右指针,方便在循环中设置范围。因此可以写一个去除首尾以及中间多余空格的方法,接着调用一个方法反转字符串,最后再用一个方法反转单词中的字符串。在去除首尾以及中间多余空格的方法中建立start和end指针,如果首位是空格就可以直接移动指针,之后正常遍历字符串,将单词和单词后的第一个空格加入SrtringBuilder。反转单词时,用start指针标记单词的起点,用end指针找到单词的结尾,end指针不指向空格时继续移动。

2024-02-02 23:40:07 247

原创 代码随想录算法训练营第七天 | 454. 四数相加 II、383. 赎金信、15. 三数之和、18. 四数之和

本题要求计算有多少个元组满足和为0的要求,因此可以使用HashMap,key用来存储和,value用来存储和出现的次数。在此之前,首先创建一个整型count用来做方法的返回值。之后先遍历前两个数组,将每两个元素的和以及出现的次数记录在HashMap中。然后遍历后两个数组,用getOrDefault去刚刚的HashMap中寻找是否有key是0减去剩余的两个元素的和,是的话就将对应的出现次数加到count上,否则加的是默认值0。

2024-02-01 20:59:22 246 1

原创 代码随想录算法训练营第六天 | 242. 有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和

本题要求判断两个字符串中每个字符出现的次数,可以使用数组,将每个字母记为不同下标,在遍历第一个字符串时在遇到的字符串上做累加,遍历第二个字符串时再递减,最后检查这个数组有没有不为0的元素就可以判断两个字符串中每个字符出现的次数是否相同。因此可以创建一个大小为26的整型数组,遍历字符串中的每个字符时,使字符减去'a',得到本字母与a字母ASCII码的差值,就达成了每个字母对应一个下标的目的。

2024-01-30 21:36:07 315 1

原创 代码随想录算法训练营第四天 | 24. 两两交换链表中的节点、19. 删除链表的倒数第 N 个结点、面试题 02.07. 链表相交、142. 环形链表 II

本题同样可以创建指向head的虚拟头节点dummy方便操作。当后两个节点都不为空时执行交换操作(如果后面只有一个则不需要再交换)。分别使用临时节点temp1和temp2储存第一个节点和第三个节点的指针,之后再进行节点指针的调换。

2024-01-29 18:41:56 335

原创 代码随想录算法训练营第三天 | 203. 移除链表元素、707. 设计链表、206. 反转链表

只要遍历到链表里的每个元素判断值是否为val,值为val的元素删除即可。链表中的删除操作通过将.next设为.next.next实现。循环条件设为while (cur.next!= null),每检查一个结点之后将cur设为下一个结点,但是这样没法检查头结点,因此我们创建一个虚拟结点dummy,将dummy的next设为头结点,在进入循环之前将cur设为dummy就可以解决这个问题了。最后返回dummy.next打印删除后的链表。

2024-01-27 20:47:27 194

原创 代码随想录算法训练营第二天 | 977. 有序数组的平方、209. 长度最小的子数组、59. 螺旋矩阵 II、数组总结

数组算法题一般采用的解决方法有二分法、快慢指针法和滑动窗口法。这些方法都是使用两个指针来不断控制当前程序运行的范围。其中,二分法是通过每次计算中间值将范围缩减一半。而快慢指针法和滑动窗口法都是一个指针用来遍历,另一个指针根据条件进行移动。比如在27. 移除元素中,慢指针只有在快指针指向的元素是不用被移除的元素时才移动。而在209. 长度最小的子数组使用的移动窗口法中,左侧指针在当前范围的和超过target后向左移动。

2024-01-26 20:48:40 387 1

原创 代码随想录算法训练营第一天 | (选做)35. 搜索插入位置、34. 在排序数组中查找元素的第一个和最后一个位置

本题要求找出给定目标值在数组中的开始位置和结束位置,分开计算开始位置和结束位置比较好写,可以将计算开始位置和计算结束位置写成两个方法。同时对于target不在数组中的情况,返回[-1, -1]。

2024-01-26 18:30:10 343 1

原创 代码随想录算法训练营第一天 | 704. 二分查找、27. 移除元素

首先介绍一下二分法。对于元素有序且不重复的数组,可以使用二分法查找某个特定元素的下标。二分法简单来说就是循环的将数组对半分,每次都先取一个最中间的值,判断要找的元素比这个中间值大还是小,如果元素比中间值小,就将搜索区间变为上一次的搜索区间的前一半,反之就将搜索区间变为上一次的搜索区间的后一半。第一次搜索之前,将搜索区间设为整个数组。搜索区间的变化可以使用left和right两个变量来实现,这两个变量也可以理解为指针。left和right的作用是划定要搜索的数组下标。

2024-01-24 19:22:29 322

原创 二叉树-二叉树的修改与构造 | 226.翻转二叉树

思路: 当root为null时直接返回null。写一个交换左右孩子的swap方法,先调用该方法再分别以左右孩子作为参数递归的调用自身(前序遍历),这样当孩子为空时在调用自身时也会返回null。,翻转这棵二叉树,并返回其根节点。给你一棵二叉树的根节点。

2023-08-25 15:51:26 82 1

原创 二叉树-二叉树的属性 | 101. 对称二叉树

1.层序遍历:本题仍然可以使用层序遍历,在添加节点时,若左孩子不为空则加入队列并添加数值到resList中,为空也要添加null到resList中,最后从两端对比resList的值是否相等,不相等就返回false,全部相等则为对称。2.递归:使用递归判断左右孩子是否相等时,只有左右孩子均为空时直接返回true,或均不为空且值相等时才相等,其它情况列出并返回false。均不为空且值相等时继续分别比较外侧和里侧,当外侧和里侧都相等时才对称。, 检查它是否轴对称。给你一个二叉树的根节点。

2023-05-09 12:02:35 55

原创 二叉树-二叉树的遍历方式 | 144.二叉树的前序遍历、94.二叉树的中序遍历、145.二叉树的后序遍历、层序遍历

当当前结点或栈不为空时处理元素,如果当前结点不为空,先将当前结点入栈,再将指针指向左孩子,到当前结点为空时弹出元素并将指针指向右孩子,重复当前循环。先将当前结点入栈,弹出时将结点的值加入list,再分别将左孩子和右孩子入栈(这样会先弹出右孩子),当栈不为空时继续while循环,当栈为空时说明遍历结束。在方法中,如果结点为空则已经遍历到最底层,返回。先将当前结点入栈,弹出时将结点的值加入list,再分别将右孩子和左孩子入栈(这样会先弹出左孩子),当栈不为空时继续while循环,当栈为空时说明遍历结束。

2023-04-25 20:43:18 71

原创 栈与队列 | 232.用栈实现队列、225.用队列实现栈、20.有效的括号、1047.删除字符串中的所有相邻重复项、150.逆波兰表达式求值、239.滑动窗口最大值、347.前 K 个高频元素

思路:入队操作可以直接使用入栈,但是出队时由于队列与栈的出元素顺序相反,可以在每次出队时先将元素全部弹入出栈的栈,再从出栈中弹出元素。将这个把全部元素弹入出栈的操作写为一个方法,在出栈和返回栈顶元素时使用。最后,当入栈和出栈的栈全部为空时,栈为空。思路:可以在每次入队时都重新排列所有元素,将已在队列中的其余元素全部弹出重新入队,这样新进的元素就在队首,出队的顺序就是最新进的元素最先出,与出栈顺序相同。请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(

2023-04-18 10:16:05 64

原创 字符串 | 344.反转字符串、541.反转字符串II、剑指Offer 05.替换空格、151.翻转字符串里的单词、剑指Offer58-II.左旋转字符串

最后反转各个单词,在end指针指到空格时反转空格前面的字符,然后将start指针移动到空格后,将end指针移动到start指针后,继续循环,遍历整个StringBuilder。思路:本题可以先判断字符串是否为null或者长度为0,之后扩容数组至空格已经替换后的大小,然后再用双指针法,左指针指向原始字符串最后一个位置,右指针指向扩容后的字符串数组的最后一个位置,当左指针没有指向空格时,将左指针的内容赋给右指针,当左指针指向空格时,填充"%20"。反转的方法依然是前几题使用的反转字符串方法。

2023-04-16 16:58:45 55

原创 哈希表 | 242.有效的字母异位词、349.两个数组的交集、202.快乐数、1.两数之和、454.四数相加II、383.赎金信、15.三数之和、18.四数之和

在循环中先对nums[i]进行剪枝,由于数组已经是按照从小到大的顺序排列的,如果nums[i]>0则后面的元素也都>0,不可能存在等于0的三元组,直接返回此时为空的result。遍历到nums3和nums4时,当0-(nums3[i] + nums4[j])已在HashMap中存在时就取出相应的和出现过的次数,加到结果上。思路:使用数组来保存每个字符出现的次数,数组下标与字母一一对应,遍历字符串s时增加每个字符串的计数,遍历字符串t时再减去每个字符串的计数,如果存在不为0的计数则不是异位词。

2023-04-11 13:50:56 110

原创 链表 | 203.移除链表元素、707.设计链表、206.反转链表、24.两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题 02.07. 链表相交、142.环形链表II

通过计算还可以得出head到入环处的长度恰等于相遇处到入环处的长度,因此相遇后再设一个index1指针指向相遇处,index2指针指向head,当两个指针相等时指针的值即为题目要求的pos。分别使用临时节点temp1和temp2储存第一个节点和第三个节点的指针,之后再进行节点指针的调换。先计算链表A、B的长度,再将较长的链表的长度和指针赋给A,用lenA-lenB计算两表相差的长度,再让curA指针移动相应的长度对齐便可以开始比较。给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。

2023-04-08 16:31:08 70

原创 数组 | 704.二分查找、27.移除元素、977.有序数组的平方 、209.长度最小的子数组、59.螺旋矩阵II

数组平方的最大值就在数组的两端,因此双指针分别指向数组的两端,从两端开始比较两个指针指向元素的大小,较大的一个放入新数组,同时移动指针,之后继续比较直到left>right。由于数组的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖,因此如果采用暴力解,每删除一个元素就要将后面的所有元素向前移动一位。并且,由于新移动过来的第一个元素放在了刚刚覆盖掉的元素的位置,还没有检查该元素是否需要删除,i的大小需要保持不变,需要添加i--来对冲循环条件中的i++。组成的新数组,要求也按。

2023-04-07 10:43:48 123 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除