- 博客(44)
- 收藏
- 关注
原创 [LeetCode]day34 347.前k个高频元素
在小顶堆中,每次弹出的元素都是堆中最小的元素,堆中剩的是大的;大顶堆中,每次弹出的元素都是堆中最大的元素,堆中剩的是小的。所以我们可以设置一个大小为k的优先队列,遍历Map的过程中去维护这个队列。给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的。k 的取值范围是 [1, 数组中不相同的元素的个数],队列内部的元素总是有序的,按照元素的权值进行排序。要求频率前k个高的元素的元素,很自然的就是先想到。
2025-03-06 20:32:25
613
原创 [LeetCode]day33 150.逆波兰式求表达值 + 239.滑动窗口最大值
操作时,可能会出现要弹出滑动窗口的那个元素在更大的元素push进来时,就被弹出了,就不用真的进行pop()。tokens[i] 是一个算符(“+”、“-”、“*” 或 “/”),或是在范围 [-200, 200] 内的一个整数。输入:tokens = [“10”,“6”,“9”,“3”,“+”,“-11”,“输入:tokens = [“4”,“13”,“5”,“/”,“+”]输入:tokens = [“2”,“1”,“+”,“3”,“*”]我们使用一个队列,在这个队列中,只存放可能成为最大值的数字。
2025-03-04 22:09:31
739
原创 [LeetCode]day32 1047.删除字符串中的所有相邻重复项
例如,在 “abbaca” 中,我们可以删除 “bb” 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 “aaca”,其中又只有 “aa” 可以执行重复项删除操作,所以最后的字符串为 “ca”。给出由小写字母组成的字符串 s,重复项删除操作会选择两个相邻且相同的字母,并删除它们。还有一个值得注意的地方就是 c++中字符串string本身就提供了类似栈的接口。在完成所有重复项删除操作后返回最终的字符串。在 s 上反复执行重复项删除操作,直到无法继续删除。输入:“abbaca”
2025-03-01 21:05:12
132
原创 [LeetCode]day31 20.有效的括号
3.遍历完字符串之后,判断栈是否为空,如果为空则返回true;不为空返回false;就取栈顶看是否相匹配,不相配返回false,相配弹出。s 仅由括号 ‘()[]{}’ 组成。输入:s = “()[]{}”输入:s = “([])”输入:s = “()”输入:s = “(]”
2025-02-28 22:45:22
284
原创 [LeetCode]day30 225.用队列实现栈
你只能使用队列的标准操作 —— 也就是 push to back、peek/pop from front、size 和 is empty 这些操作。你可以使用 list (列表)或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。当元素出栈时,需要最后一个进来的元素出去,但是队列中会让第一个进来的元素出去,所以需要把最后一个元素之前的所有元素全都执行。
2025-02-27 22:59:44
250
原创 [LeetCode]day29 232.用栈实现队列
你 只能 使用标准的栈操作 —— 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。入栈就直接进入in栈,出栈时如果out栈不为空,out栈执行pop操作,反之,In栈元素全部压入out栈中再pop。进行pop操作时,先将除栈底元素的其他元素全部压入另外一个栈中,弹出栈底元素之后再压回。假设所有操作都是有效的 (例如,一个空的队列不会调用 pop 或者 peek 操作)int pop() 从队列的开头移除并返回元素。
2025-02-26 23:05:22
928
原创 [LeetCode]day28 459.重复的子字符串
拼接字符串掐头去尾(因为新的字符串是由原来的两个字符串拼接而成的,如果不进行掐头去尾肯定可以找到原本的字符串)找原本的字符串。
2025-02-25 14:07:25
282
原创 [LeetCode]day27 28. 找出字符串中第一个匹配项的下标
给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。我本来的想法是当主串剩余的字符数比子串还少时,肯定不能匹配成功了,但是在匹配过程中i可能会大于haystack.size()-needle.size()输入:haystack = “leetcode”, needle = “leeto”解释:“leeto” 没有在 “leetcode” 中出现,所以返回 -1。求next数组时,在处理不相同情况。
2025-02-21 14:10:10
877
原创 [CamaCoder]day26 55. 右旋字符串(第八期模拟笔试)
字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k,请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。输入共包含两行,第一行为一个正整数 k,代表右旋转的位数。第二行为字符串 s,代表需要旋转的字符串。例如,对于输入字符串 “abcdefg” 和整数 2,函数应该将其转换为 “fgabcde”。上一道题翻转单词 是将整个字符串翻转了之后再翻转每个单词。输出共一行,为进行了右旋转操作后的字符串。
2025-02-18 22:28:19
254
原创 [LeetCode]day25 151.翻转字符串里的单词
注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。s 中使用至少一个空格将字符串中的 单词 分隔开。解释:如果两个单词间有多余的空格,反转后的字符串需要将单词间的空格减少到仅有一个。返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。给你一个字符串 s ,请你反转字符串中 单词 的顺序。解释:反转后的字符串中不能存在前导空格和尾随空格。输入:s = “a good example”
2025-02-17 22:41:23
306
原创 [CamaCoder]day24 54. 替换数字
给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。例如,对于输入字符串 “a1b2c3”,函数应该将其转换为 “anumberbnumbercnumber”。第一想法是遍历字符串 遍历到一个数字 就对字符串进行扩容 然后要移动字母。打印一个新的字符串,其中每个数字字符都被替换为了number。输入一个字符串 s,s 仅包含小写字母和数字字符。
2025-02-15 22:48:37
347
原创 [LeetCode]day23 344.反转字符串 + 541.反转字符串2
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。示例 1:输入:s = [“h”,“e”,“l”,“l”,“o”]输出:[“o”,“l”,“l”,“e”,“h”]示例 2:输入:s = [“H”,“a”,“n”,“n”,“a”,“h”]输出:[“h”,“a”,“n”,“n”,“a”,“H”]提示:s[i] 都是 ASCII 码表中的可打印字符。
2025-02-15 21:32:38
324
原创 [LeetCode]day22 18.四数之和
给你一个由 n 个整数组成的数组 nums ,和一个目标值 target。输出:[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]输入:nums = [1,0,-1,0,-2,2], target = 0。输入:nums = [2,2,2,2,2], target = 8。你可以按 任意顺序 返回答案。a、b、c 和 d 互不相同。输出:[[2,2,2,2]]
2025-02-13 20:26:45
836
原创 [LeetCode]day21 15.三数之和
给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i!= k ,同时还满足 nums[i] + nums[j] + nums[k] == 0。如果是判断nums[i]==nums[i+1] i就直接移到下标为2的位置上了,有效的三元组就被略过去了。如果是判断nums[i]==nums[i-1],就可以有效的略过相同的情况。不同的三元组是 [-1,0,1] 和 [-1,-1,2]。输出:[[-1,-1,2],[-1,0,1]]
2025-02-12 22:35:23
1152
原创 [LeetCode]day20 383.赎金信
给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。输入:ransomNote = “aa”, magazine = “aab”输入:ransomNote = “aa”, magazine = “ab”magazine 中的每个字符只能在 ransomNote 中使用一次。输入:ransomNote = “a”, magazine = “b”ransomNote 和 magazine 由小写英文字母组成。
2025-02-11 23:01:36
369
原创 [LeetCode] day19 454. 四数相加 II
比如nums1={-2,-3}nums2={-2,-3}中两数相加出现了-5 ,可能存在两种情况[0,1]和[1,0] set只能说明存在-5这种情况,但是不能反映出有几种排列。输入:nums1 = [1,2], nums2 = [-2,-1], nums3 = [-1,2], nums4 = [0,2]输入:nums1 = [0], nums2 = [0], nums3 = [0], nums4 = [0]题目中的数字可以变得很大,如果用数组,可能存在元素过少,而下标过大的情况(下标要作为映射);
2025-02-10 23:30:27
932
原创 [LeetCode]day18 202.快乐数
这里有一个易错点 就是最开始我是写成了普通的while循环,但是最开始fast和slow都被初始化为n 如果一上来就判断。然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果某一次结果出现了重复,说明进入了循环,不是开心数,直接返回false;不是,则返回 false。对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。如果这个过程 结果为 1,那么这个数就是快乐数。最终结果为1,退出循环,是开心数,返回true;编写一个算法来判断一个数 n 是不是快乐数。
2025-02-09 10:30:51
676
原创 [LeetCode]day17 349.两个数组的交集
如果数据更大一些,就可以考虑使用set 其中unordered_set查询效率比较高。输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]输入:nums1 = [1,2,2,1], nums2 = [2,2]给定两个数组 nums1 和 nums2 ,返回它们的交集。最容易想到的就是使用双重循环遍历两个数组,发现有相同元素并且。由于这道题中,数组中的数据最大为1000,我们可以考虑使用。输出结果中的每个元素一定是唯一的。解释:[4,9] 也是可通过的。时,就加入结果数组中。
2025-02-08 21:52:33
1241
原创 [LeetCode]day16 242.有效的字母异位词
在这道题中,我们使用普通数组来统计字符串s中每个字母出现的频率,比如:有一个a,就在0号位置上加1,有一个b,就在1号位置上加1。再统计字符串t中每个字母出现的频率,在hash数组中然后减去,比如:有一个a,就在0号位置上减1,有一个b,就在1号位置上减1。用该字母-‘a’ 得到的数 因为为自动转换为ASCII码值 ,'a'-'a'=0;'b'-'a'=1..我在第一遍书写时,最后在遍历hash数组时,我直接写了hash.size(),这是一种错误的写法!hash数组是一个原生数组,不是STL容器,
2025-02-07 22:51:12
415
原创 【LeetCode】day15 142.环形链表II
快指针一次移动两步,慢指针一次移动一步,相当于慢指针静止,快指针以一步的速度追慢指针,而一个节点的距离已经算是链表中单位距离,所以两个指针一定会相遇。举一个形象的比喻,跑800米,如果两个同学一快一慢同时跑,那么跑的快的同学一定会先领先于跑的慢的同学,然后再追赶上跑的慢的同学。所以我要找到环的入口,就让两个指针分别指向链表的头和相遇点,同向移动,最终一定能在环的入口内相遇。当n=1时,很好理解,就是慢指针要进入环内时,快指针刚好走了一圈回到环的入口。,返回链表开始入环的第一个节点。给定一个链表的头节点。
2025-02-06 21:31:42
778
原创 [LeetCode]day14面试题02.07.链表相交
如果两条链表的长度不同,如上图,可以先移动较长的链表的指针,使他们的尾部对齐(即没有遍历的结点数相同),这时就能一起移动两个指针了。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。从各自的表头开始算起,链表 A 为 [0,9,1,2,4],链表 B 为 [3,2,4]。要注意理解题意,这里的不是找值相等的节点,而是地址相同的节点,即指向同一结点的指针相同。从各自的表头开始算起,链表 A 为 [2,6,4],链表 B 为 [1,5]。
2025-02-05 21:00:37
785
原创 [LeetCode]day13 19.删除链表的倒数第n个结点
fast先移动两个元素的位置指向2 然后fast和slow一起移动直到fast指向最后一个元素 fast要移动三个元素 slow移动三个元素就是指向3 是倒数第二个元素前的一个元素。快指针先移动n步 即指向第n个元素 然后快慢指针一起移动 直到快指针指向最后一个元素。慢指针此时就指向了第size-n个元素,即倒数第n个元素的前一个元素。我们假设链表的长度为size,待删元素为倒数第n个元素。我们采用两个指针,一个为快指针,一个为慢指针。3.再遍历使指针指向待删结点的前一个结点,
2025-02-04 22:28:17
549
原创 [LeetCode]day12 24.两两交换链表中的节点
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
2025-02-03 11:47:06
256
原创 【LeetCode】day11 206.反转链表
第一想法就是使用头插法 很好理解 按照1,2,3,4的顺序进行头插 得到的实际链表顺序是 4,3,2,1。要注意我们会用到两个指针,一个是用于进行头插,一个是记录待插部分链表的头结点!,请你反转链表,并返回反转后的链表。直接逆转原链表的指针指向。
2025-02-03 11:46:57
522
原创 [LeetCode]day10 707.设计链表
加了一个虚拟头结点之后相当于链表中实际上有size+1个结点 所以每次for循环如果是从head节点开始,都是遍历到第index个结点前的一个结点 而我们get函数中需要遍历到第index个结点 所以从第一个有效结点head->next开始!易错点在于遍历时初始化linkNode*p 时 要初始化为头结点 即linkeNode*p=head;// 链表变为 1->2->3。// 现在,链表变为 1->3。你可以选择使用单链表或者双链表,设计并实现自己的链表。是指向下一个节点的指针/引用。
2025-02-01 22:09:06
1098
原创 [LeetCode]day9 203.移除链表元素
nullptr&&head->val==val) 两个判断的前后顺序千万不能反..一定要先判断是否为空,再判断是否等于val. 因为当head为空时先判断head->val==val会造成访问空指针的错误!这道题唯一的难点就是在于怎么处理返回这个头结点,题目中的这个头结点是带有数据的,而不是指向第一个有效结点的结点 ,所以是有可能为待删除元素的,而删除这个头结点和删除其他节点的操作有所不同。数据结构里早就学过怎么删除链表元素了,原本以为可以手拿把掐,没想到一写就出各种细节上的问题!
2025-02-01 22:08:51
543
原创 day 8 44. 开发商购买土地
如果是采用暴力求解,我们需要将n行n列都遍历一遍获得所有可能的切割方式,对于每一个切割位置,要分别算两部分的总和;在一个城市区域内,被划分成了n * m个连续的区块,每个区块都拥有不同的权值,代表着其土地价值。,一次性计算每一行的总和 ,然后通过累加方式计算每次横向切割时上半部分和下半部分的总和,只需要在每次切割时进行线性累加,避免了重复计算。这里要注意一个细节就是切割的范围为0~n-1 而不是0~n 因为如果从n这里分开的话 右边的区域就为空了 横着切的时候也是同样的道理。n 和 m 不同时为 1。
2025-01-30 11:51:33
292
原创 day7 区间和
第一行输入为整数数组 Array 的长度 n,接下来 n 行,每行一个整数,表示数组的元素。随后的输入为需要计算总和的区间下标:a,b (b > = a),直至文件结束。例如要计算区间3-5的区间和 例如vec={1,2,3,4,5,6} 区间3-5就是{4,5,6}给定一个整数数组 Array,请计算该数组在每个指定区间内元素的总和。pre[i]记录了vec数组中从vec[0]到vec[i]的数据之和。但是会超过时间 当查询量较大时 时间复杂度比较高。这等于pre[5]-pre[2]
2025-01-29 22:55:45
225
原创 [LeetCode]day6 59.螺旋矩阵2
在做这道题时最好是留这个边的最后一个元素给下一条边处理(如图,来自代码随想录)所有元素,且元素按顺时针顺序螺旋排列的。类似于集合中的左闭右开 左闭右闭。
2025-01-28 20:48:11
217
原创 [LeetCode]day 5 209.长度最小的子数组
给定一个含有n个正整数的数组和一个正整数target找出该数组中满足其总和大于等于target的长度最小的,并返回其长度如果不存在符合条件的子数组,返回0。2子数组[4,3]是该条件下的长度最小的子数组。10j。
2025-01-28 14:06:35
498
原创 [LeetCode]day4 977.有序数组的平方
我们注意观察数组的特征,会存在负数!类似-5,-3,1,2,3 从数组的两端向内延伸,数的绝对值逐渐减小 所以两端的数据绝对值是最大的。用两个指针从数组的一头一尾向中间进行遍历,每次去比较两端数据谁的平方更大,将更大的逆序放入结果数组中。这个的思路是将数组从头到尾遍历一遍 每遍历一个元素就加入结果数组中去,将新加入的元素与原来元素的最后一个元素进行对比,如果比它小,则需要重新排序;平方后,数组变为 [16,1,0,9,100]排序后,数组变为 [0,1,9,16,100]组成的新数组,要求也按。
2025-01-25 22:59:47
612
原创 【LeetCode】day3 27.移除元素
给你一个数组nums和一个值val,你需要移除所有数值等于val的元素。元素的顺序可能发生改变。然后返回nums中与val不同的元素的数量。假设nums中不等于val的元素数量为knumsnumskvalnumsnumsk。
2025-01-24 22:32:44
304
原创 【LeetCode】day2 704.二分查找
对于区间,通常有三种定义方式,左开右闭,左闭右闭,左开右闭;前两种是较为通俗的写法左闭右闭,即类似于[1,2],其边界1,2都属于这个有效范围中,而左闭右开[1,2),则取不到2;左开右闭(1,2]则取不到1。在二分查找中,容易混淆的地方有三处1.right初始化的写法 是right=nums.size()还是nums.size()-1?2.while循环条件的写法 是left<right还是left<=right?3.边界更新的写法是left=mid;还是left=mid+1;
2025-01-23 20:38:39
583
原创 [LeetCode]day1 两数之和
给定一个整数数组nums和一个整数目标值target,请你在该数组中找出target的那整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。你可以按任意顺序返回答案。示例。
2025-01-22 21:42:40
172
原创 【数据结构】6.1树的基本概念和二叉树基本性质
每个结点下最多有两棵子树,并且子树之间是有序的,即会分成左孩子和右孩子对于普通的树来说,上面两棵树是完全一致的,但是对于二叉树来说是不同的。
2024-10-29 17:33:38
485
原创 【数据结构】5.1串String
串是一种特殊的线性表,只是它的组成元素都是字符。其与普通线性表的区别在于,串更加注重"整体性",即其基本操作通常以整体为操作对象.1.S为串名2.串长 :这个串中有五个元素,串长为5要注意串长可以为0 ,即存在空串3.子串和主串若S为主串,则它的字串包括但不限于 “”(空串),"a","ab","cde",abced";这与集合的只是有点像,子集中总是包括空集和它本身,但是这个子串要注意顺序,就是它是从主串中截取的,字符的顺序和主串中是完全一致的;比如“cba"就不是子串了4.子串位置。
2024-10-12 15:37:06
748
原创 【数据结构】4.1队列Queue
队列是一种特殊的线性表,它的特点就和它的名字一致:排队!第一个进来的,第一个出去;最后一个进来的,最后一个出去即在栈中,我们需要一个top来指向栈顶,但是在队列中,需要两个指针front头指针和rear尾指针入队只能从队列尾部入,出队只能从队列头部出需要定义一个结构体储存rear和front指针,链队列的结点int data;}qlink;}linkQueue;
2024-10-11 11:31:13
2016
空空如也
算学生和课程平均成绩
2023-11-18
输入一个运算符和两个浮点数进行计算
2023-09-21
TA创建的收藏夹 TA关注的收藏夹
TA关注的人