- 博客(169)
- 收藏
- 关注
原创 LeetCode239:滑动窗口最大值
给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。push(value):如果push的元素value大于入口元素的数值,那么就将队列入口的元素弹出,直到push元素的数值小于等于队列入口元素的数值为止。pop(value):如果窗口移除的元素value等于单调队列的出口元素,那么队列弹出元素,否则不用任何操作。输入:nums = [1,3,-1,-3,5,3,6,7], k = 3。输出:[3,3,5,5,6,7]
2024-03-26 09:45:56 211
原创 LeetCode 150:逆波兰表达式
给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。解释:该算式转化为常见的中缀算术表达式为:(4 + (13 / 5)) = 6。解释:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9。输入:tokens = [“4”,“13”,“5”,“/”,“+”]输入:tokens = [“2”,“1”,“+”,“3”,“*”]有效的算符为 ‘+’、‘-’、‘*’ 和 ‘/’。返回一个表示表达式值的整数。输入是一个根据逆波兰表示法表示的算术表达式。
2024-03-25 10:55:31 249
原创 LeetCode1047:删除字符串中的所有相邻重复项
例如,在 “abbaca” 中,我们可以删除 “bb” 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 “aaca”,其中又只有 “aa” 可以执行重复项删除操作,所以最后的字符串为 “ca”。注意题目说的是两个相邻且重复的字母,所有不用考虑连续三个相同的情况。在完成所有重复项删除操作后返回最终的字符串。给出由小写字母组成的字符串 S,重复项删除操作会选择。在 S 上反复执行重复项删除操作,直到无法继续删除。输入:“abbaca”
2024-03-25 09:23:26 311
原创 LeetCode20:括号匹配
如果遇到 ( [ {则入栈对应的 ) ] }输入:s = “()[]{}”输入:s = “()”输入:s = “(]”
2024-03-23 09:49:28 200
原创 LeetCode225:用队列实现栈
用两个队列que1和que2实现队列的功能,que2其实完全就是一个备份的作用,把que1最后面的元素以外的元素都备份到que2,然后弹出最后面的元素,再把其他元素从que2导回que1。请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。boolean empty() 如果栈是空的,返回 true;void push(int x) 将元素 x 压入栈顶。int pop() 移除并返回栈顶元素。int top() 返回栈顶元素。
2024-03-23 09:02:45 273
原创 LeetCode232:用栈实现队列
你 只能 使用标准的栈操作 —— 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。在pop的时候,必须判断out栈是否为空,如果为空,则讲in栈中的元素全部放到out栈中,否则输出out的栈顶元素。boolean empty() 如果队列为空,返回 true;void push(int x) 将元素 x 推到队列的末尾。int pop() 从队列的开头移除并返回元素。int peek() 返回队列开头的元素。
2024-03-22 20:59:48 212
原创 LeetCod459:重复的子字符串
当然,我们在判断 s + s 拼接的字符串里是否出现一个s的的时候,要刨除 s + s 的首字符和尾字符,这样避免在s+s中搜索出原来的s,我们要搜索的是中间拼接出来的s。解释: 可由子串 “abc” 重复四次构成。(或子串 “abcabc” 重复两次构成。给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。输入: s = “abcabcabcabc”解释: 可由子串 “ab” 重复两次构成。输入: s = “abab”也就是由前后相同的子串组成。输入: s = “aba”
2024-03-22 09:09:05 139
原创 LeetCode28:找出字符串中第一个匹配项的下标
给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。输入:haystack = “leetcode”, needle = “leeto”输入:haystack = “sadbutsad”, needle = “sad”解释:“leeto” 没有在 “leetcode” 中出现,所以返回 -1。解释:“sad” 在下标 0 和 6 处匹配。第一个匹配项的下标是 0 ,所以返回 0。
2024-03-21 10:44:57 194
原创 LeetCode151:反转字符串中的单词
注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。s 中使用至少一个空格将字符串中的 单词 分隔开。解释:如果两个单词间有多余的空格,反转后的字符串需要将单词间的空格减少到仅有一个。先去除多余空格,然后反转整个字符串,再对每个字符串中的单词进行反转。返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。给你一个字符串 s ,请你反转字符串中 单词 的顺序。解释:反转后的字符串中不能存在前导空格和尾随空格。
2024-03-20 18:31:24 229
原创 LeetCode 541:反转字符串Ⅱ
给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。如果剩余字符少于 k 个,则将剩余字符全部反转。输入:s = “abcdefg”, k = 2。输入:s = “abcd”, k = 2。输出:“bacdfeg”
2024-03-20 09:46:16 164
原创 LeetCode454:四数相加Ⅱ
4、在遍历大C和大D数组,找到如果 0-(c+d) 在map中出现过的话,就用count把map中key对应的value也就是出现次数统计出来。输入:nums1 = [1,2], nums2 = [-2,-1], nums3 = [-1,2], nums4 = [0,2]1、首先定义 一个unordered_map,key放a和b两数之和,value 放a和b两数之和出现的次数。2、遍历大A和大B数组,统计两个数组元素之和,和出现的次数,放到map中。最后返回统计值 count 就可以了。
2024-03-18 09:12:42 426
原创 LeetCode1:两数之和
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1]。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。输入:nums = [2,7,11,15], target = 9。输入:nums = [3,2,4], target = 6。输入:nums = [3,3], target = 6。
2024-03-15 10:06:14 434
原创 LeetCode202:快乐数
通过反复通过平方和计算下一个数字,我们最终得到 58,再继续计算之后,我们又回到 58。由于我们回到了一个已经计算过的数字,可以知道有一个循环,因此不可能达到 1。所以对于 116,函数应该返回 false。然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。不是,则返回 false。对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。如果这个过程 结果为 1,那么这个数就是快乐数。编写一个算法来判断一个数 n 是不是快乐数。:检查之前出现的数,是否会再次出现。
2024-03-15 09:23:21 378
原创 LeetCode350:两个数组的交集Ⅱ
给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。然后遍历第二个数组,看其num是否在hashMap中,如果在就将count–,并插入数组中。输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]输入:nums1 = [1,2,2,1], nums2 = [2,2]使用hashMap,将第一个数组的元素插入hashMap。
2024-03-15 09:01:12 372
原创 LeetCode349:两个数组的交集
给定两个数组 nums1 和 nums2 ,返回 它们的交集。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序。输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]输入:nums1 = [1,2,2,1], nums2 = [2,2]使用哈希表中的unordered_set对元素去重,然后再进行寻找。解释:[4,9] 也是可通过的。
2024-03-14 09:54:41 380
原创 LeetCode242:有效的字母异位词
2)创建一个26位的数组,将arr[s[i]-‘a’]++ , arr[t[i]-‘a’]–。最后判断数组中的元素是否都为0。注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。输入: s = “anagram”, t = “nagaram”输入: s = “rat”, t = “car”s 和 t 仅包含小写字母。1)进行排序,然后对比。
2024-03-14 09:23:22 398
原创 LeetCode142:环形链表
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。可以使用快慢指针法,分别定义 fast 和 slow 指针,从头结点出发,fast指针每次移动两个节点,slow指针每次移动一个节点,如果 fast 和 slow指针在途中相遇 ,说明这个链表有环。首先第一点:fast指针一定先进入环中,如果fast指针和slow指针相遇的话,一定是在环中相遇,这是毋庸置疑的。为什么fast 走两个节点,slow走一个节点,有环的话,一定会在环内相遇呢,而不是永远的错开呢。
2024-03-13 10:19:10 397
原创 LeetCode:链表相交
此时我们就可以比较curA和curB是否相同,如果不相同,同时向后移动curA和curB,如果遇到curA == curB,则找到交点。给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null。切记:不是curA->val==curB->val。将两个链表从尾部对齐,然后进行寻找。
2024-03-13 09:34:07 376
原创 LeetCode19:删除链表的倒数第N个节点
使用快慢指针,快指针先走n+1个,紧着这快慢指针一起走,快指针到最后的时候,慢指针此时在倒数第n个结点的前一个。给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
2024-03-12 10:59:18 322
原创 LeetCode24:两两交换链表中的节点
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
2024-03-12 09:59:39 298
原创 LeetCode707:设计链表
void addAtIndex(int index, int val) 将一个值为 val 的节点插入到链表中下标为 index 的节点之前。如果 index 比长度更大,该节点将 不会插入 到链表中。void deleteAtIndex(int index) 如果下标有效,则删除链表中下标为 index 的节点。int get(int index) 获取链表中下标为 index 的节点的值。void addAtTail(int val) 将一个值为 val 的节点追加到链表中作为链表的最后一个元素。
2024-03-11 11:14:42 484
原创 LeetCode203:移除链表元素
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点。
2024-03-11 09:52:10 342
原创 LeetCode54:螺旋矩阵
给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。跳出循环的条件:左边界>右边界 或者 上边界 > 下边界。
2024-03-09 15:27:33 392
原创 LeetCode59:螺旋矩阵Ⅱ
给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix。输出:[[1,2,3],[8,9,4],[7,6,5]]
2024-03-09 11:25:30 410
原创 LeetCode904:水果成篮
你可以选择任意一棵树开始采摘,你必须从 每棵 树(包括开始采摘的树)上 恰好摘一个水果。输入:fruits = [3,3,3,1,2,1,1,2,3,3,4]如果从第一棵树开始采摘,则只能采摘 [0,1] 这两棵树。如果从第一棵树开始采摘,则只能采摘 [1,2] 这两棵树。解释:可以采摘 [1,2,1,1,2] 这五棵树。输入:fruits = [1,2,3,2,2]解释:可以采摘 [2,3,2,2] 这四棵树。输入:fruits = [0,1,2,2]解释:可以采摘 [1,2,2] 这三棵树。
2024-03-08 10:00:45 373
原创 滑动窗口的题目解题思想和模板
—核心:左右双指针(L,R)在起始点,R向右逐位滑动循环。——核心:左右双指针(L,R)在起始点,R向右逐位滑动循环。如果:窗内元素满足条件,R向右扩大窗口,并更新最优结果。如果:窗内元素满足条件,L向右缩小窗口,并更新最优结果。满足xxx条件(计算结果、出现次数、同时包含)如果:窗内元素到不到条件,R向右扩大窗口。如果:窗内元素不满足条件,L向右缩小窗口。例如:长度最小的子数组。字串\子数组\子序列。
2024-03-08 09:27:15 372
原创 LeetCode209:长度最小的子数组
numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0。输入:target = 7, nums = [2,3,1,2,4,3]找出该数组中满足其总和大于等于 target 的长度最小的 连续。给定一个含有 n 个正整数的数组和一个正整数 target。解释:子数组 [4,3] 是该条件下的长度最小的子数组。
2024-03-08 08:46:49 374
原创 LeetCode977:有序数组的平方
给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。使用双指针分别指向数组的头和尾部,因为头部和尾部的平方是最大的(如果存在负数),然后将二者进行对比。解释:平方后,数组变为 [16,1,0,9,100]输入:nums = [-4,-1,0,3,10]排序后,数组变为 [0,1,9,16,100]输出:[0,1,9,16,100]
2024-03-07 10:01:58 391
原创 LeetCode26:删除有序数组中重复项
给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。然后返回 nums 中唯一元素的个数。更改数组 nums ,使 nums 的前 k 个元素包含唯一元素,并按照它们最初在 nums 中出现的顺序排列。nums 的其余元素与 nums 的大小不重要。解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2。使用快慢指针,均从下表1开始判断,判断nums[fast]是否等于nums[fast-1]。
2024-03-07 09:13:06 333
原创 LeetCode27: 移除元素
解释:函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。例如,函数返回的新长度为 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。输入:nums = [3,2,2,3], val = 3。输出:2, nums = [2,2]
2024-03-07 08:37:22 596
原创 LeetCode34: 在排序数组中查找元素的第一个和最后一个位置
给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。输入:nums = [5,7,7,8,8,10], target = 8。输入:nums = [5,7,7,8,8,10], target = 6。你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。先根据二分查找利用范围找出左边的,再根据二分查找利用范围找出右边的。如果数组中不存在目标值 target,返回 [-1, -1]。输出:[-1,-1]
2024-03-05 11:25:46 413
原创 LeetCode45:搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。输入: nums = [1,3,5,6], target = 5。输入: nums = [1,3,5,6], target = 2。请必须使用时间复杂度为 O(log n) 的算法。
2024-03-05 11:23:45 410
原创 LeetCode704:二分查找
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。输入: nums = [-1,0,3,5,9,12], target = 9。解释: 9 出现在 nums 中并且下标为 4。
2024-03-05 11:21:49 381
原创 LeetCode15:三数之和
给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i!= k ,同时还满足 nums[i] + nums[j] + nums[k] == 0。例如将target=-a, a+b=target。不同的三元组是 [-1,0,1] 和 [-1,-1,2]。输入:nums = [-1,0,1,2,-1,-4]输出:[[-1,-1,2],[-1,0,1]]注意,输出的顺序和三元组的顺序并不重要。输入:nums = [0,1,1]
2024-03-03 21:04:49 387
原创 LeetCode167:两数之和 II - 输入有序数组
如果设这两个数分别是 numbers[index1] 和 numbers[index2] ,则 1 <= index1 < index2 <= numbers.length。以长度为 2 的整数数组 [index1, index2] 的形式返回这两个整数的下标 index1 和 index2。因此 index1 = 1, index2 = 2。输入:numbers = [2,7,11,15], target = 9。输入:numbers = [2,3,4], target = 6。
2024-03-02 20:25:04 431
原创 LeetCode25: K 个一组翻转链表
k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。
2024-03-01 17:30:00 422
原创 LeetCode215: 数组中的第K个最大元素
使用快速排序,每次使用里面的partition可以确定一个元素最后的位置,将该位置与k进行对比。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。第k大的元素可以与排序后的元素对应上,但是使用排序就不符合时间复杂度的要求了。给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。输入: [3,2,3,1,2,4,5,5,6], k = 4。你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。输入: [3,2,1,5,6,4], k = 2。
2024-02-29 10:47:44 422
原创 LeetCode146: LRU缓存
int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1。// 该操作会使得关键字 2 作废,缓存是 {1=1, 3=3}// 该操作会使得关键字 1 作废,缓存是 {4=4, 3=3}lRUCache.put(2, 2);// 缓存是 {1=1, 2=2}// 返回 -1 (未找到)lRUCache.get(1);// 返回 -1 (未找到)lRUCache.put(1, 1);// 缓存是 {1=1}lRUCache.get(1);2、使用HashMap。
2024-02-23 16:15:35 688
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人