![](https://img-blog.csdnimg.cn/6f38ddb10c6e493ea483fb7ccba5dced.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
leetcode
力扣刷题关键点记录
Zannnne
哈尔滨工业大学硕士
展开
-
NO.2 | 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II
参考讲解链接:https://programmercarl.com/0059.%E8%9E%BA%E6%97%8B%E7%9F%A9%E9%98%B5II.html#%E6%80%9D%E8%B7%AF。参考链接:https://www.bilibili.com/video/BV1tZ4y1q7XE/?解题思路:我认为实际上是对暴力解法的优化,暴力解法使用两层for循环,该解法把第二层for循环改成了while,只有在必要的时候更新滑动窗口的起始位置。还有就是当n为奇数时,中间的一个元素要单独赋值。原创 2023-10-26 22:16:30 · 572 阅读 · 0 评论 -
NO.1 | 704. 二分查找,27. 移除元素
双指针思路讲解:https://programmercarl.com/0027.%E7%A7%BB%E9%99%A4%E5%85%83%E7%B4%A0.html#%E6%80%9D%E8%B7%AF。解题思路:用覆盖代替删除,舍弃val的元素,然后被其他元素覆盖。原创 2023-10-25 21:25:55 · 656 阅读 · 0 评论 -
232. 用栈实现队列 和 225. 用队列实现栈
232. 用栈实现队列 和 225. 用队列实现栈1. 总体思路:2. 用栈实现队列:2. 用队列实现栈:题号:力扣232,力扣225知识点:栈,队列,模拟目标完成度:67/150总结题干:1. 总体思路:1.用栈模拟队列,使用两个栈,不断倒腾。2.用队列模拟栈,使用两个队列,其中一个是备份。2. 用栈实现队列:1.push:直接压入栈A2.pop:如果栈B为空,把栈A中的所有元素pop然后push到栈B。然后栈B pop。3.peek:复用pop,但是不能删除这个元素,要原创 2022-05-28 12:36:13 · 82 阅读 · 0 评论 -
459. 重复的子字符串
459. 重复的子字符串题号:力扣459知识点:字符串匹配,kmp目标完成度:66/150总结题干:思路:1.利用前缀表判断是否为子串重复多次构成。2.由子串重复多次构成的字符串的前缀表特征为第一个重复子串的前缀表的长度是主串长度的一个因子。前缀表的最后一个数是最大的。3.(len-(next[len-1]+1))表示第一个子串的长度,如果是主串长度是其倍数,说明主串是由重复子串构成。不满足则不是。class Solution {public: // 得到前缀表 v原创 2022-05-28 10:24:04 · 154 阅读 · 0 评论 -
28. 实现 strStr()
@[TOC](28. 实现 strStr())题号:力扣028知识点:KMP,字符串目标完成度:65/150总结题干:思路:1.经典的KMP匹配。查找子串在主串中的位置。2.next是前缀表:记录下标i之前(包括i)的字符串中,有多大长度的相同前缀3.首先通过get_next函数计算模式串(子串)的前缀表。4.然后通过一个for循环遍历主串,如果主串中的元素与子串中的元素不相等,则子串位置根据前缀表回退。5.如果主串中的元素与子串中的元素相等,则子串指针位置后移一个。6.当子原创 2022-05-27 22:04:04 · 76 阅读 · 0 评论 -
剑指 Offer 58 - II. 左旋转字符串
剑指 Offer 58 - II. 左旋转字符串题号:力扣剑指 Offer 58 - II知识点:字符串,双指针目标完成度:64/150总结题干:思路:1.使用快慢指针,先让fast走n步,并记录下前n个字符(也就是左边的n个字符)到left_s中。2.然后快指针和慢指针同时往右移动,将快指针所指的字符放到慢指针所指的位置,实现第n个之后的字符前移n位。3.然后再将left_s中的字符接着慢指针的位置更新到字符串的右边// C++class Solution {public原创 2022-05-25 22:32:19 · 69 阅读 · 0 评论 -
18. 四数之和
18. 四数之和题号:力扣18知识点:双指针目标完成度:63/150总结题干:思路:class Solution {public: vector<vector<int>> fourSum(vector<int>& nums, int target) { sort(nums.begin(), nums.end()); vector<vector<int>> ret;原创 2022-05-23 21:05:42 · 67 阅读 · 0 评论 -
15. 三数之和
15. 三数之和题号:力扣15知识点:数组,双指针目标完成度:62/150总结题干:思路:1.首先对数组进行排序,为了后续使用双指针2.使用一层遍历,这层遍历的数当作a,然后再定义左指针和右指针,分别对应b和c。3.固定a的值,使用while循环,查找符合a+b+c=0的b和c的值。4.难点:注意输出结果去重,去重方法,如果当前位置和上一个位置的数值一样的话,就跳过。class Solution {public: vector<vector<int>&原创 2022-05-22 14:30:43 · 100 阅读 · 0 评论 -
454. 四数相加 II
454. 四数相加 II题号:力扣454知识点:数组,哈希目标完成度:61/150总结题干:思路:1.简单的暴力想法就是四层循环遍历四个数组,计算四数相加为0的次数,但这种想法应该会超时。2.划分为两两相加,nums1和nums2求和得sum1,nums3和nums4求和得sum2,然后再计算sum1 + sum2 == 0的次数,这样可以将时间复杂度降到n2n^2n23.再改进一下,先对nums1和nums2求和,并将求和的结果存储在一个哈希表中,key值为他们的和,value值为这原创 2022-05-22 13:40:23 · 150 阅读 · 0 评论 -
202. 快乐数
202. 快乐数题号:力扣202知识点:哈希目标完成度:3/150总结题干:思路:1.这个题的难点是无限循环时的处理,如何在无限循环时退出程序。2.无限循环说明sum的值重复出现过,这样就好处理了。使用一个unordered_set集合来判断sum是否重复出现。3.如果sum重复出现了,则为false4.如果sum为1了,则为trueclass Solution {public: // 计算sum int getSum(int n){ int sum原创 2022-05-22 13:08:05 · 108 阅读 · 0 评论 -
438. 找到字符串中所有字母异位词
438. 找到字符串中所有字母异位词题号:力扣438知识点:字符串,滚动窗口目标完成度:59/150总结题干:思路:1.如果s的长度小于p,则s中必然找不到与p是异位词的子串。2.异位词的特点是每个字母出现的次数一直,但是出现的顺序不一定相同。因此我们建立两个容器,来记录p中和滚动窗口中每个字母出现的次数,由于字母一共只有26个,所以容易大小为26。3.第一个for循环相当于是对scount进行初始化,同时统计p中每个字母出现的次数。4.第二个for循环是滚动窗口,窗口的长度为p原创 2022-05-22 12:46:20 · 237 阅读 · 0 评论 -
142. 环形链表 II
142. 环形链表 II题号:力扣142知识点:链表,双指针目标完成度:58/150总结题干:思路:1.设置一个快指针和一个慢指针,快指针每次走两步,慢指针每次走一步,当快指针和慢指针相遇时,说明有环2.然后再分别从头结点和相遇结点出发两个指针,每次同时移动一步,当这两个指针相遇时的结点就是入环的第一个结点(证明见链接https://www.programmercarl.com/0142.%E7%8E%AF%E5%BD%A2%E9%93%BE%E8%A1%A8II.html)原创 2022-05-22 09:56:30 · 127 阅读 · 0 评论 -
49. 字母异位词分组
49. 字母异位词分组题号:力扣49知识点:哈希,字符串目标完成度:57/150总结题干:思路:1.异位词就是字母类别和个数相同的单词,但是字母的排列顺序不同。2.我们可以先对所有单词排个序,如果是异位词的话,排序之后应该是一样的字符串。3.然后再以排序之后的字符串为key值,以排序之前的单词为value值,存到unordered_map中4.异位词由于有相同key值的,所有在unordered_map中存储在同一个key值之下。5.最后再通过一个迭代器将每一个key值对应的存原创 2022-05-22 09:47:03 · 171 阅读 · 0 评论 -
面试题 02.07. 链表相交
面试题 02.07. 链表相交题号:力扣面试题 02.07知识点:链表目标完成度:56/150总结题干:思路:1.先看下题目,题目比较长,大致意思是找到从后往前的公共子串的第一个结点。看到这个题目想到了一个类似的题目14. 最长公共前缀。2.14题这个比较简单,就是求字符串的最长公共前缀,而本题实际上可以理解为求最长公共后缀的问题。3.根据以上思路,可以先求出headA和headB的链表长度,假设headA的长度大于headB,计算出他们的长度之差为delta 4.然后先让原创 2022-05-20 21:33:32 · 191 阅读 · 0 评论 -
19. 删除链表的倒数第 N 个结点
19. 删除链表的倒数第 N 个结点题号:力扣19知识点:链表,双指针目标完成度:55/150总结题干:思路一:1.建立一个虚拟头结点dummyHead2.先求出链表的总长度,然后算出倒数第n个结点的从前往后数的位置3.while循环结束后cur指向要删除结点的前一个结点class Solution {public: ListNode* removeNthFromEnd(ListNode* head, int n) { ListNode *dummy原创 2022-05-20 20:36:28 · 148 阅读 · 0 评论 -
24. 两两交换链表中的节点
24. 两两交换链表中的节点题号:力扣24知识点:链表目标完成度:54/150总结题干:思路:1.模拟题,主要是想明白这个过程2.建一个虚拟头结点dummyNode,以减少对头结点的单独处理3.先让当前结点的后继结点指向其后继结点的后继结点4.然后让当前结点的后继结点的后继结点指向 原当前结点的后继结点(此处需要建一个临时结点tmp)5.然后让当前结点的后继结点的后继结点的后继结点指向 原当前结点的后继结点的后继结点的后继结点(此处需要建一个临时结点tmp2)6.最后让当前原创 2022-05-20 19:57:25 · 145 阅读 · 0 评论 -
203. 移除链表元素
203. 移除链表元素题号:力扣203知识点:链表目标完成度:53/150总结题干:思路:1.题意比较简单,C++代码如下:2.第一个while循环用来处理头结点,如果头结点的值等于val的话,需要将头结点后移,后移后并将原来的头结点删除3.第二个while循环用来处理非头结点,如果当前结点的后继结点的值等于val,需要将后继结点删除,也就是让当前结点的后继结点指向当前结点的后继结点的后继结点(跳过一个后继结点,就相当于删除了,后面的delete是为了释放没有的结点所占的空间)原创 2022-05-18 21:54:46 · 133 阅读 · 0 评论 -
209. 长度最小的子数组
209. 长度最小的子数组题号:力扣209知识点:数组,滑动窗口目标完成度:52/150总结题干:滑动窗口解法思路:1.先让窗口的右边界移动,如果子数组的和大于或等于了target,记录子数组长度,并同时移动窗口的左边界。2.在左右边界移动的过程中,只要子数组的和大于等于了target,那么就会得到一个子数组的长度,过程中需要一直维护这个变量为当前最小值3.窗口左侧边界的移动时,说明子数组之和已经大于或等于了target,为了测试减小一个左侧的数是否还成立,若成立就得到了更小的子原创 2022-05-16 22:19:35 · 70 阅读 · 2 评论 -
27. 移除元素
27. 移除元素题号:力扣27知识点:数组, 双指针目标完成度:51/150总结题干:思路:1.使用快慢指针解法,fast指针在前面“探路”,每次循环右移一步。2.当fast指针和val不相等时,slow紧跟fast,相当于把fast复制了一遍,但是还是只用了同一个数组3.当fast指针和val相等时,slow不跟,相当于就不复制了# C++ 双指针class Solution {public: int removeElement(vector<int>原创 2022-05-16 18:45:43 · 83 阅读 · 0 评论 -
3. 无重复字符的最长子串
3. 无重复字符的最长子串题号:力扣003知识点:字符串,滑动窗口目标完成度:50/150总结题干:思路:1.通过散列表来判断该字符是否出现过,并用value记录该字符最近一次出现的下标位置2.left为左指针,指向起点位置-1。或者出现重复字符后,指向新的起点位置–该字符上次出现的位置3.res为维护的表示最长字符串长度的变量class Solution: def lengthOfLongestSubstring(self, s: str) -> int:原创 2022-05-14 14:30:58 · 87 阅读 · 0 评论 -
2016. 增量元素之间的最大差值
2016. 增量元素之间的最大差值题号:力扣2016知识点:数组目标完成度:49/150总结题干:思路:1.题目意思解读:如果后面的数比前面的大,就计算后面的数比前面大多少,最后返回大的最多的差值。2.从前向后遍历数组,维护一个遍历到的最小值min_num,每遍历一个元素判断其是否大于前面的出现过的最小的元素,如果是,则计算其差值,并维护一个最大差值变量max_delta,将其差值与最大差值变量比较取较大者保留。class Solution: def maximumDi原创 2022-05-11 20:20:19 · 69 阅读 · 0 评论 -
剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
剑指 Offer 21. 调整数组顺序使奇数位于偶数前面题号:力扣 剑指 Offer 21知识点:双指针目标完成度:48/150总结题干:常规做法:1.遍历数组,把奇数元素放在nums1里面,把偶数元素放在nums2里面2.返回nums1+nums2# 常规做法class Solution: def exchange(self, nums: List[int]) -> List[int]: nums1 = [] nums2 = []原创 2022-05-10 19:13:00 · 140 阅读 · 0 评论 -
53. 最大子数组和
53. 最大子数组和题号:力扣53知识点:动态规划目标完成度:47/150总结题干:思路:1.如果子数字nums[i, j]的和最大,则说明在i之前的元素和<=0,在j之后的元素和<=02.状态转移方程如下class Solution: def maxSubArray(self, nums: List[int]) -> int: if len(nums) == 0: return 0 dp = [原创 2022-05-09 22:42:29 · 132 阅读 · 0 评论 -
125. 验证回文串
125. 验证回文串题号:力扣125知识点:双指针,字符串目标完成度:46/150总结题干:方法1-双指针:1.由于忽略字母的大小写,首先使用s = s.lower()把字符串统一成全部小写2.然后使用双指针,如果左指针和右指针都是指向的数字或字母,判断左右指针指向的字母或数字是否相同,如果相同,则left += 1, right -= 1, 继续向中间靠拢;如果不同则返回False,终止。3.如果左指针不是指向的数字或字母,则left += 1。4.如果右指针不是指向的数字或字原创 2022-05-08 09:29:40 · 369 阅读 · 0 评论 -
680. 验证回文字符串 Ⅱ
680. 验证回文字符串 Ⅱ题号:力扣00680知识点:双指针目标完成度:45/150总结题干:思路:1.题干补充一个条件:最多删掉一个字符并且不能移动其他字符2.使用双指针的方法解答,如果头指针和尾指针的字符相同,则向中间移动继续判断。3.如果头指针的字符和尾指针的字符不相同,则判断删除左侧或删除右侧一个字符后的子串是否为回文串。class Solution: def validPalindrome(self, s: str) -> bool:原创 2022-05-07 21:38:26 · 294 阅读 · 0 评论 -
409. 最长回文串
409. 最长回文串题号:力扣409知识点:贪心,哈希,字符串目标完成度:44/150总结题干:思路:1.回文字符串的样式:BAB2.我的想法是,首先要构成回文字符串,除了中间的那个类的字母数量可以是奇数个,其他的都必须是偶数个。3.如果s中的某类字母的个数是偶数2n个,则这2n个在构造回文字符串时都可以用上。4.如果s中的某类字母的个数是奇数2n+1个,则除了回文字符串中间位置可以允许放奇数个字符,其他位置用上2n个。5.那么放在中间的字母是哪一类呢?根据贪心思想,放奇数次字原创 2022-05-07 19:51:29 · 197 阅读 · 0 评论 -
605. 种花问题
605. 种花问题题号:力扣605知识点:贪心,数组目标完成度:43/150总结题干:思路:1.遍历数组,如果当前位置是0,并且它前一个位置和后一个位置也是0,则说明该位置可以种花。把该位置种上花,该位置的元素改为1,表示已经有花了。2.难点在于边界的处理,第一个位置和最后一个位置如果是0时需要特殊处理。class Solution: def canPlaceFlowers(self, flowerbed: List[int], n: int) -> bool:原创 2022-05-06 21:10:18 · 322 阅读 · 0 评论 -
506. 相对名次
506. 相对名次题号:力扣506知识点:排序,哈希目标完成度:42/150总结题干:思路:1.此题解法略繁琐,但思路还是有价值的2.首先看到题目根据分数得出排名,可以看作是一个映射关系:得分–>排名,一般出现映射关系的都可以用哈希来做3.首先在ret中按照分数排个名,然后把排名信息转移到字典中,以此建立起映射关系(key:得分, value:排名)4.然后按照score中的分数出现顺序输出排名class Solution: def findRelativeRa原创 2022-05-04 21:53:20 · 216 阅读 · 0 评论 -
389. 找不同
389. 找不同题号:力扣389知识点:哈希目标完成度:41/150总结题干:思路:1.首先对s和t构造字典,得到其中出现的各个字符以及他们出现的次数。2.然后遍历t所构造的字典(遍历t是因为t中的元素要多于s)3.如果遍历到的某元素也在s中,并且出现的次数相等就跳过4.如果遍历到的某元素也在s中,并且出现的次数不相等,那么t多出的元素就是要找的不同5.如果遍历到的某元素不在s中,把该元素也是要找的不同class Solution: def findTheDiffe原创 2022-05-04 11:14:56 · 135 阅读 · 0 评论 -
20. 有效的括号
20. 有效的括号题号:力扣20知识点:矩阵目标完成度:40/150总结题干:思路:1.括号匹配的栈的重要应用之一2.如果给的字符串是奇数个字符,则肯定无法完全匹配,至少剩下一个括号,直接返回False3.使用字典构造括号的匹配关系,为什么让右括号做key呢?因为左括号先出现,先入栈,当出现右括号时要在栈顶找对应的左括号。也就是说,括号的匹配只有当右括号出现的时候才触发4.遍历字符串,如果是个左括号,入栈;5.如果是个右括号,分两种情况。一是此时栈空,说明没有任何左括号与该右原创 2022-05-04 10:08:04 · 208 阅读 · 0 评论 -
852. 山脉数组的峰顶索引
852. 山脉数组的峰顶索引题号:力扣852知识点:二分查找目标完成度:39/150总结题干:思路:1.二分查找 O(logn)2.在最大元素之前,数组递增;在最大元素之后,数组递减。3.将mid与它前后的数比较,如果是递增的,则说明最大元素在mid的右边;如果是递减的,则说明最大元素在mid的左边;4.如果arr[mid] > arr[mid-1] and arr[mid] > arr[mid-1],则说明arr[mid]就是最大的元素# python3 二分查原创 2022-05-03 18:09:28 · 146 阅读 · 0 评论 -
剑指 Offer 11. 旋转数组的最小数字
剑指 Offer 11. 旋转数组的最小数字题号:剑指 Offer 11知识点:二分查找目标完成度:38/150总结题干:思路:1.暴力解法很简单,但这并不是面试官想看的2.二分查找的方法:核心是查找由大变小的分界点。3.当numbers[mid] < numbers[right]时,说明[mid, right]区间是递增的(严格说应该是非递减),分界点不在这里面4.当numbers[mid] > numbers[right]时,说明[mid, right]区间是先增原创 2022-05-03 17:31:06 · 143 阅读 · 0 评论 -
LCP 28. 采购方案
LCP 28. 采购方案题号:力扣LCP28知识点:双指针,二分查找目标完成度:3/150总结题干:双指针:相似题目:LCP 18. 早餐组合1.首先对数组排序2.left 指向数组的头部,right 指向尾部3.与LCP 18不同的是,这里只有一个数组,while循环的条件为left<right,仅在left后查找,可以避免重复计数。当left 和right为两个数组时,while循环的条件为left<len(staple) and right>=0。4.原创 2022-05-03 16:54:03 · 162 阅读 · 0 评论 -
LCP 18. 早餐组合
LCP 18. 早餐组合题号:力扣LCP18知识点:二分查找,双指针目标完成度:36/150总结题干:方法1 二分查找:1.总体思路:遍历staple,计算剩余的钱,在drink中查找小于等于剩余的前的商品数量,这一步使用二分查找def lessNum(nums, target)class Solution: def breakfastNumber(self, staple: List[int], drinks: List[int], x: int) -> int:原创 2022-05-03 16:13:48 · 192 阅读 · 0 评论 -
2089. 找出数组排序后的目标下标
2089. 找出数组排序后的目标下标题号:力扣2089知识点:二分查找,数组目标完成度:35/150总结题干:方法1 二分查找:1.总体思路:排序后,利用def checkLeft(nums, target),先查找最左边的target的位置,然后再利用def checkRight(nums, target)查找最右边的target的位置。2.该方法与力扣34题比较像,链接见文末# python# 方法1 二分查找:class Solution: def targetI原创 2022-05-03 15:16:59 · 1062 阅读 · 0 评论 -
744. 寻找比目标字母大的最小字母
744. 寻找比目标字母大的最小字母题号:力扣744知识点:二分查找目标完成度:34/150总结题干:思路:1.先处理题干最后说的循环处理问题,当target >= letters[-1]时,触发循环,返回第一个字符2.while主循环为二分查找的主体,注意当letters[mid] == target时,left = mid + 1,这样是为了避免数组中包含有多个重复的target,而我们想要的是大于这个target的第一个字符class Solution: de原创 2022-05-03 14:35:01 · 80 阅读 · 0 评论 -
34. 在排序数组中查找元素的第一个和最后一个位置
34. 在排序数组中查找元素的第一个和最后一个位置题号:力扣34知识点:二分查找目标完成度:33/150总结题干:思路:1.总体思路:首先用二分查找最左边的target,然后再用二分查找最右边的target2.具体操作:查找最左边的target时,让右边的指针不断收缩,当nums[mid] < target时,说明mid左边的元素都严格小于target,因此让left = mid + 1,后面再判断if nums[left] == target:,如果不相等就说明没有查找到,返原创 2022-05-03 00:47:25 · 244 阅读 · 0 评论 -
219. 存在重复元素 II
219. 存在重复元素 II题号:力扣219知识点:哈希表目标完成度:32/150总结题干:思路:class Solution: def containsNearbyDuplicate(self, nums: List[int], k: int) -> bool: dic = {} for i in range(len(nums)): if nums[i] in dic: i原创 2022-04-28 17:33:44 · 330 阅读 · 0 评论 -
463. 岛屿的周长
463. 岛屿的周长题号:力扣463知识点:DFS目标完成度:31/150总结题干:思路:1.刚开始想着使用类似200题:岛屿数量DFS的方法做,结果无法通过全部测试2.首先还是使用两层循环遍历每一个元素,当遍历到的元素为1时,使用check函数检查该元素上下左右是否为0,如果上下左右为0,则将计数器edge += 13.然后处理边界,当为1的元素在矩阵的最上下两行或者最左最右两列时,也存在一个边界算作周长,依次检查各个边界,并加到edge[0]上class Solution原创 2022-04-27 21:22:45 · 269 阅读 · 0 评论 -
130. 被围绕的区域
1.题名题号:力扣001知识点:矩阵目标完成度:3/150总结题干:思路:class Solution: def dfs(self, grid, r, c, tag): nr = len(grid) nc = len(grid[0]) grid[r][c] = tag if r-1>=0 and grid[r-1][c]=='O': self.dfs(grid, r-1, c, tag)原创 2022-04-26 22:04:36 · 213 阅读 · 0 评论