- 博客(80)
- 问答 (2)
- 收藏
- 关注
原创 Leetcode周赛 | 2023-8-6
这道题完全就是唬人,只要想明白了,只要有两个连续的数的和,大于target,那么一定可以,两边一次切一个就好了。将向左和向下的代码去掉后,因为我觉得向左和向右是无意义的,通过的用例多了一些,但还是超时。尽力了,想不出来别的方法,只能通过一半的测试用例,其他超时。因为不仅可以向右和向下走,还可以向上和向左,所以不能dp。改成了动态规划的方法,还是解答错误,但是通过的用例更多了。从来没接触过这道题的解法,也看不懂。
2023-08-06 19:56:02 475
原创 Leetcode周赛 | 2023-8-5
一开始是觉得这道题是贪心的,选出现次数最多的元素,但是发现,当有多个元素出现次数均为最多时,似乎很难处理,就放弃了。转而问ChatGPT ,结果让自己走上了考虑动态规划的不归路。同样,最后对操作次数进行枚举,找出第一次满足条件的次数,返回答案即可。(上面说复制数组,其实只要头元素复制到最后,尾元素复制到最前,也行)这道题当时大概看了一眼,觉得没思路就放弃了。就是贪心,就是贪心,就是贪心。
2023-08-06 09:05:44 540
原创 代码随想录算法训练营第三十三天 | Leetcode随机抽题检测
一开始题意理解错了,以为 text1 是母串, text2 是子串,但是重读题后,发现两个串是互相独立的,这也就意味着:dp[i][j] 更新要同时考虑 max(dp[i-1][j],dp[i][j-1]) , 所以本题也无法做状态压缩,必须是二维DP数组。而替换操作:dp[i-1][j-1] 将word1[i] or word2[j] 替换为相对应的那个值,这时候,word1[i] 和 word2[j] 是匹配上的,且不能用于前面子串的匹配,所以前面子串的操作个数为 : dp[i-1][j-1]。
2023-08-03 15:01:54 445
原创 代码随想录算法训练营第三十二天 | Leetcode随机抽题检测
有重复元素,这道题会了,才算是掌握了二分法。一开始想的是,将二维矩阵展开为一维,再用最基础的二分法。但是这样要额外花费 O(m*n) 的内存空间。
2023-08-03 02:42:15 2371
原创 代码随想录算法训练营第三十二天 | 全是没接触过的知识点,要复习
i + +) {j + +) {} // 感染函数= '1') {return;} }
2023-08-02 19:15:50 324
原创 代码随想录算法训练营第二十九天 | Leetcode随机抽题检测
比如:1-2-3-4 ,不加入虚拟头时,一开始A,B均在 1 ,移动一步,A在2,B在3,此时还要继续移动,while不退出,继续移动,A在3,B为None,while退出,此时让A.next = None,做切断操作,这明显是错误的!一开始总想着用递归做,但是发现,在递归中,无法时刻保存当前需要赋值的节点,因为本题要求不能返回任意值,也就是要操作原节点,所以递归函数返回值,赋值,这些操作都是无效的,所以应该用前序遍历的迭代法。递归函数在返回时,同前面做过的一道题,返回的时候,没有左右都考虑的情况。
2023-08-02 01:26:06 333
原创 代码随想录算法训练营第二十八天 | Leetcode随机抽题检测
Leetcode随机抽题检测--使用题库:Leetcode热题1001 两数之和未看解答自己编写的青春版重点题解的代码日后再次复习重新写49 字母异位词分组未看解答自己编写的青春版重点题解的代码日后再次复习重新写128 最长连续序列未看解答自己编写的青春版重点关于 left 和 right 的疑问?为什么只需要更新 num-left 和 num+right ?题解的代码日后再次复习重新写283 移动零11 盛最多水的容器未看解答自己编写的青春版重点题解的代码日后再次复习重新写15 三数之和42 接雨水未看解
2023-07-31 23:26:15 2280
原创 代码随想录算法训练营第三十天 | 单调栈系列复习
在上面原代码的基础上进行的修改,但是由于上面那一版没想到这些,用的下标是和 j-1 / j+1 比较的,简直是下标灾难!还是觉得,卡哥的题解给的方法是自然的,按我的方法,第一次确实想不到这种要单独处理的情况。3、求右边第一个更大,所以是单调递增栈,指的是:从栈顶到栈底,顺序是单增,栈顶是弹出和加入元素的位置。这题要看题解,自己写的代码中,加入的一段逻辑,是为了AC而加的,如果不是题目有错误示例,我想不到。朴实的想法是:把目标数组复制一倍,将目标数组扩容为两倍,然后对这个两倍的数组做最原始的单调栈。
2023-07-30 23:35:49 875
原创 Leetcode周赛 | 2023-7-30--我真是个废物
本题只有三个字符串,一共可能的组合也没几种,那就全部遍历!一定要区分,是处理固定个数目标的题,还是处理N个目标的题,固定个数的可以全部遍历。根本没想到用双指针。原因是,没想到还要用一个字典去维护子数组中各个数字的出现频次,以及出现频次不小于1 (也就是大于0) 的数字个数。上面的代码中,根本没用到 Counter() , 就是当一个字典来用的。太恐怖了,这个编程技巧, if else 还能这样用的?这里的双重循环也很巧妙,根本想不到。
2023-07-30 12:50:48 260
原创 代码随想录算法训练营第二十七天 | 双指针法-栈与队列,两个章节的复习总结
双指针法-栈与队列双指针法章节移除元素删除有序数组中的重复项移动零比较含退格的字符串有序数组的平方反转字符串反转字符串II替换空格反转字符串中的单词纯手撕版,需要注意的地方还蛮多的反转链表删除链表的倒数第 N 个结点这道题之前做的时候没有注意,边界处理是需要着重考虑的,就是删除节点是链表尾结点的情况。为什么会有上述问题?要从本质上去分析!我们要删除倒数第N个节点,那么slow指针最后就应该停在倒数第N+1个节点,假设我们最后fast指针指向None(这个可由while循环的判断条件来控制),那么在结果处,f
2023-07-29 22:20:52 607
原创 代码随想录算法训练营第二十五天 | 读PDF复习环节3
还可以提前使用动态规划的方法,判断出给字符串的所有子串是否是回文串,然后将结果储存起来。核心代码就是,先从下到上遍历,再从左到右遍历,一共需要考虑三种情况,会导致 dp[i][j] 是回文串,dp[i][j] 代表字符串中 [i,j] 的子串,是不是回文串。本题需要注意的是,虽然元素可以重复,但是必须要有idx,idx是保证,遍历一直是正序的,不会走回头路。冗余的代码,本题不需要 used 数组,idx 已经可以控制,不出现重复了。注意分割区间定义即可,左闭右闭。我觉得我还剪了一下枝,挺好,
2023-07-26 07:51:41 1203
原创 代码随想录算法训练营第二十二天 | 读PDF复习环节2
二叉树章节,做不出来的题基本上都有一个共性,对二叉树的数据结构特性不熟悉,从而没有编写思路,或者在判断条件上产生疏漏。完全二叉树:除了最底层可能没填满,其余每层节点数都达到最大值,并且最下面一层的节点,都集中在该层最左边的若干位置。一个很关键的点:完全二叉树的某些子树,一定是满二叉树,节点数量是可以计算的。去计算最左和最后,一直向左找,计数,一直向右找,计数,如果两数相等,这颗子树就是满二叉树。二叉搜索树:若它的左子树不空,则左子树上所有节点的值,均小于它的根节点的值。若它的右子树不空,则右子树上所有节点的
2023-07-25 19:43:18 2422
原创 Leetcode周赛 | 2023-7-24
最后一个 A 之后是否还有任务跟随取决于是否存在与任务 A 出现次数相同的任务。输入: tasks = [“A”,“A”,“A”,“B”,“B”,“B”,“C”,“C”,“D”,“D”], n = 2。执行顺序: A -> B -> C -> A -> B -> D -> A -> B -> C -> D。A -> (单位时间) -> (单位时间) -> A -> (单位时间) -> (单位时间) -> A。A -> B -> (单位时间) -> A -> B -> (单位时间) -> A -> B。
2023-07-24 11:25:33 292
原创 Leetcode周赛 | 2023-7-23
因为,当节点从 nums[j] 移动到 nums[i] 时,所获得的得分跟 nums[i] 有关,而和nums[j]没有直接关系,nums[j]的值,已经包含在最大价值中了。因为当前位置的最大价值一定是由前面某个位置过来的,前面的那个位置的数,不是奇数就是偶数,那么我记录奇数的最大价值,和偶数的最大价值,就可以推出,当前点的最大价值了!这个地方比较绕,可能想不明白,这里的奇偶性,指的是,当前遍历到的 nums[i] ,最大值指的是,下标在当前点的,得分总和的最大值。怎么能一直往回溯上想!
2023-07-23 01:04:20 227
原创 代码随想录算法训练营第二十一天 | 读PDF复习环节1
这道题的精髓就是明白:两块质量不相等的石头相撞,质量大的那一个,还会把差值退回去!所以本题还是分两堆,然后用01背包去装。情况1:左右节点都有覆盖情况2:左右节点至少有一个无覆盖的情况情况3:左右节点至少有一个有摄像头情况4:头结点没有覆盖。
2023-07-21 02:16:05 1483
原创 代码随想录算法训练营第二十天 | 动态规划系列9,10,11,12
我只会写,dp数组含义是,以 i 结尾的子串的最大长度,这样的话,虽然是一维dp数组,但要两层循环遍历。注意,这里“以 i 结尾”是一个非常重要的点,也是本题的关键,只有这样才能有判断“递增”的条件。“连续”同理。本题依然是按照动规五部曲来思考的,真好用。class Solution : def lengthOfLIS(self , nums : List [ int ]) - > int : n = len(nums) # 初始化初始化 dp = [ 1 ] * n。
2023-07-18 02:02:02 1741
原创 代码随想录算法训练营第十九天 | 动态规划系列5,6,7,8
这周稍微对动态规划有点感觉了。动规周总结背包问题结束啦,代码随想录对不同问题进行了不同角度的分类,用来复习真的很棒。背包问题总结篇解答错误,错在无法明确股票是在哪一天买入和卖出的,在递推公式上,就会出现错误和混乱。错误的dp数组含义:在前 i 天买入卖出所得的最大金钱。又想了想,想出了一个自己觉得就很垃圾的方案。dp数组含义:在第 i 天卖出所得的最大金钱。在本题中,初始化同样需要注意,本题的示例中已说明,如果没有交易完成,return 0。
2023-07-16 13:12:48 2306
原创 代码随想录算法训练营第十八天 | 动态规划系列1,2,3,4
动态规划系列1总结本周的题,我主要失败在递推公式找不到上,而且两题均是只差一点就找到了!动态规划系列2总结想不到怎么用01背包。只想到了求和,除以2,但是怎么用背包还是不懂。本周就讲了01背包问题,01背包问题全部用一维DP数组求解。动态规划系列3总结动态规划系列4总结。
2023-07-15 01:02:12 1514
原创 代码随想录算法训练营第十七天 | 贪心系列全部
直接上链接。贪心系列1总结直接上链接。本周最值得注意的就是跳跃游戏,用拘泥于每次究竟跳几步,而是看覆盖范围,覆盖范围内一定是可以跳过来的,不用管是怎么跳的。贪心系列2总结贪心系列3总结本周的题,总的来说,都是求解重叠区间的类型,这类题我现在理解的有两个注意点。一是一定要先排序,并且可以统一就用左区间排序,不管什么问题,都用左区间排序。二是,一定要记得,在每次判断中,都要去修改右边界的值。放上代码随想录总结的链接如下。贪心系列总结3好好好!复习贪心的大纲!贪心的中等题和难题一定要多练。贪心系列大总结。
2023-07-13 23:34:32 1168
原创 代码随想录算法训练营第十六天 | 回溯系列3与回溯系列4
代码随想录的总结中,对各个大类的问题的时间空间复杂度分析,分析的很好。回溯系列3总结这篇总结写的太好了!一定要细看!一刷这次没仔细看。回溯系列大总结。
2023-07-13 00:56:15 776
原创 代码随想录算法训练营第X天 | 栈和队列系列与二叉树系列--读博文复习小记
用两个栈实现队列的题中,最关键的是意识到:由于栈的先入后出特性,将栈A倒序至栈B后,栈B的pop顺序就是栈A的反向,同时也是A的队列顺序。但是在队列实现栈的设定中,将队列A反向的结果,依然是队列A,因为队列是先入先出的,先出元素又再次先入。所以此题是用队列B存储队列A pop 出的前 n-1 个元素,此时队列A中剩下的最后一个元素,即为栈对应的元素,然后交换队列A和队列B。队列B始终保持为空,因为队列A在pop之后,为空,队列B有 n-1 个元素,交换AB后,队列B为空,回归操作前状态。
2023-07-10 22:19:42 75
原创 代码随想录算法训练营第十一天 | 二叉树系列2
直接放代码随想录总结文章的链接。二叉树系列2总结回溯法其实就是递归,但是很少人用迭代的方式去实现回溯算法!讲了这么多二叉树题目的迭代法,有的同学会疑惑,迭代法中究竟什么时候用队列,什么时候用栈?如果是模拟前中后序遍历就用栈,如果是适合层序遍历就用队列,当然还是其他情况,那么就是 先用队列试试行不行,不行就用栈。
2023-07-07 15:47:03 1545
原创 代码随想录算法训练营第九天 | 栈与队列系列所有
在进一步看,本题中每一个子表达式要得出一个结果,然后拿这个结果再进行运算,那么这岂不就是一个相邻字符串消除的过程,和1047.删除字符串中的所有相邻重复项 (opens new window)中的对对碰游戏是不是就非常像了。但还有一些技巧,在匹配左括号的时候,右括号先入栈,就只需要比较当前元素和栈顶相不相等就可以了,比左括号先入栈代码实现要简单的多了!队列是先进先出的规则,把一个队列中的数据导入另一个队列中,数据的顺序并没有变,并没有变成先进后出的顺序。思路:用栈操作运算,遇到数字则入栈;
2023-07-05 22:54:44 2020
原创 代码随想录算法训练营第九天 | 双指针法系列
我觉得给出的代码不好,怪不得第一遍写完后,印象非常浅薄,原因就是Python的内置函数太方便了,一个split就把空格全部去掉,并且完成了单词的切割,这不好。在编写过程中,已经可以完全理清思路2的做法,但由于Python编程语言的特性:str为不可更改类型,所以强硬写出来并不美观,不如直接替换。没想到的是如何处理空格,只能想到了很复杂的方法,先处理前后,再处理中间,实则运用双指针法就可以去除所有空格。看了视频后,自己写出来的,注意:最后的else的最后,要移动left和right,不然就会陷入循环。
2023-07-04 12:42:19 96
原创 代码随想录算法训练营第八天 | 字符串进阶系列2(左旋转字符串--找出字符串中第一个匹配项的下标--重复的子字符串)
给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。代码随想录中提出的,通过多次翻转,不需要申请额外的存储空间,只在原数组上操作的方法。给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。
2023-07-03 20:29:10 1822
原创 代码随想录算法训练营第七天 | 字符串基础系列1(反转字符串--反转字符串II--替换空格--反转字符串中的单词)
代码随想录中给出了使用双指针想法来解决本题的思路,其出发点是不申请额外的存储空间,但是需要知道字符串中有几个空格,所以还是用了count方法,内部逻辑也是遍历了一遍数组,不过O(2n)和O(n)没什么区别,还是要承认这种省空间的做法。只不过一开始的想法中,还要对字符串为奇数还是偶数分类讨论,但是看了代码随想录的解答后,发现,left < right 就可以了,不需要分类讨论。之前一直说,不要用内置函数,但是看了代码随想录的解答后,似乎split()这样的函数可以随便用啊,那问题就没有我想的那么复杂了。
2023-07-03 11:26:58 1813
原创 代码随想录算法训练营第六天 | 哈希表系列2(两数之和--四数相加II--三数之和--四数之和)
在遍历数组的时候,只需要向map去查询是否有和目前遍历元素匹配的数值,如果有,就找到的匹配对,如果没有,就把目前遍历的元素放进map中,因为map存放的就是我们访问过的元素。因为本地,我们不仅要知道元素有没有遍历过,还要知道这个元素对应的下标,需要使用 key value结构来存放,key来存元素,value来存下标,那么使用map正合适。map中的key和value用来存什么的。那么判断元素是否出现,这个元素就要作为key,所以数组中的元素作为key,有key对应的就是value,value用来存下标。
2023-07-02 17:17:40 2087
原创 代码随想录算法训练营第五天 | 哈希表系列1(哈希表理论基础--有效的字母异位词--快乐数)
对于这种情况,defaultdict就可以避免这个错误,defaultdict的作用是在于,当字典里的element不存在但被查找时,返回的不是keyError而是一个默认值,返回的是工厂函数的默认值,比如list对应[ ],str对应的是空字符串,set对应set( ),int对应0。第一次做这道题的时候,想的还是像前面题使用的逻辑,先对每一个字符串建立一个26长度的record,然后通过两层循环,去判断是否相等。给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
2023-07-02 13:03:47 2874
空空如也
全局优化的应用场景有哪些?
2021-12-21
有哪些全局最小唯一但是局部极小不唯一的应用场景
2021-12-20
TA创建的收藏夹 TA关注的收藏夹
TA关注的人