- 博客(93)
- 收藏
- 关注
原创 力扣刷题Day 79:跳跃游戏 II(45)
方法1(反向贪心):倒着遍历nums[: n - 1],找到能够跳到nums[-1]的最小元素索引j,再倒着遍历nums[: j],找到能够跳到nums[j]的最小元素索引,依次类推,直到最小元素索引为0,得到最小跳跃次数。方法2(正向贪心):遍历nums[: n - 1],找到能够跳到nums[-1]的最小元素索引j,再遍历nums[: j],找到能够跳到nums[j]的最小元素索引,依次类推,直到最小元素索引为0,得到最小跳跃次数。方法3(灵茶山艾府佬的建桥思路,真正的贪心,推荐):
2025-07-18 11:32:49
317
原创 力扣刷题Day 78:跳跃游戏(55)
方法1(暴力):声明一个布尔数组jump,代表当前索引的元素是否能跳到,在遍历对应jump为True的nums时不断修改jump,看最终能否到达nums最末端。方法2(贪心思想):声明一个存放元素索引的辅助栈stack,遍历nums,将它能跳到的元素按照索引增序依次加到栈里(记得剔除已访问过的元素),然后弹栈(弹出的元素是当前最大的元素,此处使用贪心策略),跳到末尾就返回True,直到栈空都没跳到末尾的话就返回False。方法3(灵茶山艾府佬合并区间的方法):把每个nums[i]看成闭区间[i, i +
2025-07-03 11:51:18
204
原创 力扣刷题Day 77:买卖股票的最佳时机(121)
总体用了动态规划的思想,思路进化史如下:1.声明一个数组存放当前位置的元素前面最小的元素,计算原数组与该此前最小数组的差值,输出最大差值。2.声明一个数组存放当前位置的元素与此前最小的元素之差,输出这个差值数组的最大值。3.用一个变量存放此前最大的元素之差,节省空间。
2025-07-01 10:58:50
217
原创 力扣刷题Day 76:数据流的中位数(295)
方法1:将数字有序地插入数组,使用二分查找插入位置的方法。方法2:在获取中位数时对数组进行排序。方法3:Krahets佬的大小堆方法,建立一个小顶堆A和一个大顶堆B,分别保存数组较大的一半和较小的一半,则中位数可以根据A、B的堆顶元素得到。需要注意的是,heapq模块是小顶堆,实现大顶堆需在插入和弹出操作中均将元素取反。
2025-06-28 11:13:44
224
原创 力扣刷题Day 75:前 K 个高频元素(347)
方法1(字典+暴力排序):通过字典统计数组中每个元素出现的频率,然后将字典遍历k次,找到前k大词频并输出相应的数。方法2(字典+手写大顶堆):通过字典统计数组中每个元素出现的频率,然后将字典转化成形如(键, 值)的列表,将数频构建成大顶堆,排k轮后返回倒数k个数频对应的元素即可。方法3(字典+手写小顶堆):通过字典统计数组中每个元素出现的频率,然后将字典转化成形如(键, 值)的列表,将数频构建成小顶堆,排(len(nums) - k)轮后返回前k个数频对应的元素即可。方法4(灵茶山艾府佬的桶排序做法)
2025-06-27 11:34:16
303
原创 力扣刷题Day 74:数组中的第K个最大元素(215)
方法1(小顶堆):小顶堆排序后元素呈降序,所以只需排(len(nums) - k + 1)轮后输出nums的第k位元素即可。方法2(大顶堆):大顶堆排序后元素呈升序,所以只需排k轮后输出nums的倒数第k位元素即可。方法3(Krahets佬的快速选择方法):快速排序的主要思想就是哨兵划分和分治递归。首先在nums中随机选择一个数作为哨兵,将数组划分成小于、等于、大于哨兵的三部分,第k大数字在小于还是大于哨兵的部分就对这一部分继续做哨兵选择与数组划分,直到第k大数字等于哨兵,返回哨兵即可。
2025-06-23 10:28:48
322
原创 力扣刷题Day 73:寻找两个正序数组的中位数(4)
完全学习了灵茶山艾府佬从双指针到二分的思路。首先我们需要明确,这道题寻找两个正序数组的中位数实际上就相当于查找第k小的数,k = ⌈(m + n) / 2⌉,如果(m + n)是奇数则返回第k小的数,如果(m + n)是偶数则返回第k小的数与第(k + 1)小的数的平均值。接下来分别使用双指针(不符合时间复杂度但可以帮助理解)和二分(符合时间复杂度)这两种方法解题。方法1(双指针,时间复杂度为O(m + n)):中位数可以将数值集合划分为大小相等的两部分,枚举nums1分别有0、1、···、len
2025-06-16 17:47:09
222
原创 力扣刷题Day 72:寻找旋转排序数组中的最小值(153)
方法1(自己想的):原地用分治的方法找到前一个元素比后一个元素大的索引,直接输出。方法2(对灵茶山艾府佬的二分法做了一点改动):不停二分,判断nums[mid]与nums末尾元素的大小关系,如果nums[mid] < nums[-1],那么分割点separate一定在[left, mid - 1]上,否则分割点separate就在[mid + 1, right]上。
2025-06-06 11:15:57
180
原创 力扣刷题Day 71:搜索旋转排序数组(33)
方法1(自己想的):首先用分治法找到数组前半段和后半段的衔接处separate,若target刚好在nums[: separate]或nums[separate + 1 :]里则在对应区间里二分查找target,否则直接返回-1。方法2(受灵茶山艾府佬题解的启发):不停二分,判断nums[mid]与nums末尾元素的大小关系,如果nums[mid] < nums[-1],那么分割点separate一定在[left, mid - 1]上,否则分割点separate就在[mid + 1, right]上,找到
2025-06-05 16:31:31
171
原创 力扣刷题Day 70:在排序数组中查找元素的第一个和最后一个位置(34)
方法1(自己写的):一次二分查找找到等于target的一个元素索引axis,然后向左右延伸找边界。方法2(灵茶山艾府佬的闭区间二分查找写法):定义一个lower_bound()函数找到第一个大于等于某数的元素索引,分别对target和(target + 1)调用lower_bound()函数即可。方法3(对方法2的自主延伸):两次二分查找,分别找小于等于(target - 1)的元素索引以及大于等于(target + 1)的元素索引。
2025-06-04 18:13:45
356
原创 力扣刷题Day 69:搜索二维矩阵(74)
首先判断target是否有可能在矩阵的某一行里,没可能直接返回False,有可能就在这一行里二分查找。
2025-06-03 17:30:00
485
原创 力扣刷题Day 67:N 皇后(51)
方法1:将第一行的皇后依次放置在0 ~ n - 1上,可以发现0 ~ (⌊n / 2⌋ - 1)上的放置方案与⌈n / 2⌉ ~ (n - 1)上的放置方案是对称的,此外,如果n是奇数的话还需额外考虑⌊n / 2⌋处的放置方案。声明一个长度为n的全零数组unselected标记当前方案里每一列的占用情况(0即当前索引列未占用,1即当前索引列已占用),然后用回溯的方法深度优先搜索可行的放置方案。判断当前方案是否可行的条件就是题目当中所说的棋子们不能出现同在一行/一列/斜线上的情况,不能在同一行所以每次回溯都要
2025-06-02 21:20:01
441
原创 力扣刷题Day 66:分割回文串(131)
用了回溯的方法。首先写一个验证字符串是否是回文串的函数,然后遍历s,依次判断从当前字符到下一字符是否是回文串,是的话继续往后走,不是的话往回退。
2025-06-01 18:34:05
245
原创 力扣刷题Day 65:单词搜索(79)
方法1(自己写的深度优先的回溯方法):遍历网格,每走过一格都将其坐标加入visited集合,然后向上、下、左、右四个方向查找可行路径,如果找到可行路径则一路向下延伸查找,如不可行则将该坐标从集合里删除,回退到上一坐标继续查找。方法2(参考Krahets佬的题解对方法1进行了优化):无需用tmp记录当前字符串,直接简化为记录当前字符串长度即可,可进一步节省空间(字符串tmp->整数k)与时间(startswith比较字符串->比较指定坐标的一个字符)。
2025-05-30 22:30:26
397
原创 MathWorks无法注册,显示no healthy upstream(已解决)
首先尝试点这个链接: https://www.mathworks.com/mwaccount/account/create,应该就可以了,不行的话再按下面的方法走。在登录MathWorks的邮箱那里输入注册要用的邮箱,然后点击下一步,选择忘记密码,此时邮箱里会收到一封邮件,从这个入口点进去创建账号就OK了。
2025-05-30 18:12:48
566
3
原创 力扣刷题Day 62:电话号码的字母组合(17)
方法1(迭代):依次将字符串里每个字符对应的字母拼接起来。方法2(回溯):写了个递归函数。方法3(队列):参考了腐烂的橘子佬的题解,感觉是方法1的优化版本(优化了方法1里new_res产生的额外空间)。
2025-05-29 10:38:21
302
原创 力扣刷题Day 61:子集(78)
方法1:直接用Python内置函数itertools.combinations()。方法2:回溯,参考了powcai佬的题解,nums = [1, 2, 3]的情况分析见下图。方法3: 迭代,参考了powcai佬的题解 ,依次将新的元素添加到前面的结果列表里。
2025-05-28 18:43:08
202
原创 力扣刷题Day 60:全排列(46)
方法1:用Python自带的全排列函数itertools.permutations()。方法2:参考Krahets佬的DFS回溯方法,先固定第1位元素,再固定第2位元素······固定到第n位元素时将当前序列加入结果列表,nums = [1, 2, 3]的情况分析见下图。
2025-05-28 17:22:50
254
原创 力扣刷题Day 59:实现 Trie (前缀树)(208)
方法1(简易但低效):用集合存放words,用Python自带的startswith()函数判断prefix是否为word的前缀。方法2(真正的清晰明了):参考了灵茶山艾府佬的从二叉树到二十六叉树,受益匪浅。
2025-05-28 11:50:32
296
原创 力扣刷题Day 58:课程表(207)
本题可化约为:课程安排图里是否存在存在环,参考Krahets佬的题解。方法1(BFS):统计一个入度表和一个邻接表,用一个队列存放当前还未访问过的结点,访问一个删一个(在图里删掉结点,也就是修改入度表和队列)的同时修改numCourses。方法2(DFS):统计一个邻接表,然后声明一个标记列表flags,0表示当前结点未被DFS访问,-1表示当前结点已被其它结点启动的DFS访问过了,这条路径没问题,不用再重复走一遍,1表示当前结点被当前结点启动的DFS访问到了,说明图里有环。
2025-05-28 10:26:18
277
原创 力扣刷题Day 57:腐烂的橘子(994)
方法1(自己想的,十足繁琐):首先,只有0、只有2、只有02的情况必输出0,只有1、只有01的情况必输出-1;对于其它情况(只有12、 012都有),用值3表示腐烂且已经传染过周边橘子的橘子,就比如grid = [[2, 1, 1], [1, 1, 0], [0, 1, 1]],1分钟后更新为[[3, 2, 1], [2, 1, 0], [0, 1, 1]],2分钟后更新为[[3, 3, 2], [3, 2, 0], [0, 1, 1]],3分钟后更新为[[3, 3, 3], [3, 3, 0], [0,
2025-05-27 10:13:25
618
原创 力扣刷题Day 56:岛屿数量(200)
Krahets佬的DFS / BFS思路如下:方法1(DFS):遍历整个矩阵,遇到grid[i][j] == "1"时以DFS的方法向上下左右搜索相邻陆地,最重要的一点是把走过所有陆地的结点都置0以避免后续重复搜索。方法2(BFS):遍历整个矩阵,遇到grid[i][j] == "1"时以BFS的方法将上下左右的陆地置0。
2025-05-26 18:02:57
330
原创 力扣刷题Day 55:最小覆盖子串(76)
首先说一下我的错误思路:将t写成集合,遍历s,将s中在t里的所有元素索引写到数组indice里(比如s = "ADOBECODEBANC",t = "ABC",那么indice = [0, 3, 5, 9, 10, 12]),接下来需要做的就是用滑动窗口的思想判断每个窗口是否符合“涵盖t所有字符”的条件。这个思路的错误点在于,举个例子,对于s = "aaaaaaaaaaaabbbbbcdd",t = "abcdd",正确答案是"abbbbbcdd",而我把答案的长度限制在了5,题目说了字符可以重复的。灵茶
2025-05-26 17:07:32
176
原创 力扣刷题Day 54:滑动窗口最大值(239)
想了几种方法都超出时间限制了,不得已看了Krahets佬的题解,主要用了双端队列。方法1:左窗口的起始索引是1 - k,右窗口的起始索引是0,窗口向右移动时,将deque末尾小于当前右窗口的元素弹出后再将右窗口元素入队(保证deque内部的递减顺序),则i >= 0时的每一个deque[0]都是当前窗口的最大元素,此外,i > 0且deque[0]等于左窗口左边元素的情况意味着当前最大元素已经不在窗口内了,需对deque[0]做出队处理。方法2:方法1的演化,先在nums[: k - 1]上初始化deq
2025-05-26 10:02:49
405
原创 力扣刷题Day 53:和为 K 的子数组(560)
方法1:灵茶山艾府佬的两次遍历法,先计算前缀和,然后遍历前缀和。方法2:灵茶山艾府佬的一次遍历法,一边计算前缀和,一边遍历前缀和。P.S. 至于为什么要用前缀和,是因为,nums[i]到nums[j - 1]的元素和为k可用前缀和表示为s[j] - s[i] = k,所以当s[i] == s[j] - k的时候nums[i]到nums[j - 1]的元素和为k,这样这道题就非常了然了。
2025-05-24 16:19:40
218
原创 力扣刷题Day 52:找到字符串中所有字母异位词(438)
方法1:参考郁郁雨佬的滑动窗口+数组思路,因为s和p仅包含小写字母,因此可以用长度为26的数组s_count和p_count分别记录字母在s和p中出现的次数,其中,s_count遍历s时每次都去除一个旧字符、增加一个新字符。方法2:参考郁郁雨佬的滑动窗口+双指针思路,双指针left、right表示滑动窗口的两侧边界,滑动窗口的长度等于p的长度时表示找到一个异位词。
2025-05-21 11:37:25
317
原创 力扣刷题Day 51:无重复字符的最长字串(3)
方法1(时间复杂度为N^2,空间复杂度为N^2):搞一个列表和一个字典(键为字符,值为索引)记录当前最小子串,从第一个字符开始往后找,遇到新一个字符就在字典里查,要是字典里有当前字符的话,从当前字符的下一个字符重新开始新一轮子串的查找。方法2(时间复杂度为N,空间复杂度为1):参考了Krahets佬的滑动窗口+哈希表思路,每轮循环都更新左边界i,哈希表统计字符s[j]最后一次出现的索引。
2025-05-20 11:10:53
193
原创 力扣刷题Day 50:接雨水(42)
方法1(自己想的)方法2(官方题解的动态规划)方法3(官方题解的相向双指针)方法4(灵茶山艾府佬的单调栈)
2025-05-19 19:49:27
446
原创 力扣刷题Day 49:三数之和(15)
首先将nums排序,然后以索引k遍历nums,设置i和j分别为k + 1和len(nums) - 1。(1)如果nums[k] > 0,则nums全为正数,不存在符合题意的答案,break;(2)如果nums[k] == nums[k - 1],则nums[k]的所有可能解都被nums[k - 1]的所有可能解包含了,continue;(3)但凡i < j,如果三数之和小于0,i++,跳过所有重复的nums[i];如果三数之和大于0,j--,跳过所有重复的nums[i]和nums[j]。
2025-05-14 18:30:42
190
原创 力扣刷题Day 48:盛最多水的容器(283)
学习了Krahets佬的双指针思路,初始化两个边界作为容器边界,然后逐个向数组内遍历,直到左右两指针相遇。
2025-05-13 21:38:10
320
原创 力扣刷题Day 47:移动零(283)
方法一:把nums当作栈,遍历原数组的过程中遇见非零数才更新nums,最终把剩下的nums位置全置零。方法二:双指针法,遍历原数组的过程中将当前位置的数与前面记录位置的数相交换。
2025-05-12 10:52:33
222
原创 力扣刷题Day 46:搜索二维矩阵 II(240)
方法1:分别找到搜索矩阵的右、下边界,然后从[0][0]位置开始遍历这部分矩阵搜索目标值。方法2:学习Krahets佬的思路,从搜索矩阵的左下角开始遍历,matrix[i][j] > target时消去第i行,matrix[i][j] < target时消去第j列。
2025-05-11 10:59:57
384
原创 力扣刷题Day 43:矩阵置零(73)
方法1:遍历矩阵的行和列查找0元素并置同行同列的元素为0,新创建一个m*n的矩阵以标记当前的0元素是本身就为0还是被同行同列的元素传染成0的。方法2:遍历矩阵,记录0元素的行和列,结束遍历后统一置零。
2025-05-08 20:01:53
491
原创 力扣刷题Day 42:缺失的第一个正数(238)
方法1:把原数组转化成集合,然后从1开始递增查询当前正整数是否在集合里。方法2:将原数组进行排序,删除非正数,再在数组头部加入元素0, 遍历数组就可以找出其中没有出现的最小正整数。方法3:灵茶山艾府大佬的换座位思路,一个萝卜一个坑,非常巧妙。
2025-05-08 18:47:29
208
原创 力扣刷题Day 41:除自身以外数组的乘积(238)
方法1:搞一个数组存放各元素之前所有数的乘积(头为1),再搞一个数组存放各元素之后所有数的乘积(尾为1)。方法2:上面的方法是很好理解的,在此基础上应该如何优化呢?那就是弃用prev_product数组,改用变量记录前面数的乘积,并且取消latter_product数组,直接在res数组上修改乘积。
2025-05-08 17:11:03
201
空空如也
计算机网络的分组交换里,为什么k段链路会有(k-1)次存储转发延迟啊?
2023-01-27
TA创建的收藏夹 TA关注的收藏夹
TA关注的人