![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
LeetCode刷题
记录在LeetCode的点滴
有梦的人心态要好
脚踏实地 积少成多
展开
-
力扣每日一题(五十九——(线性)动态规划)
仅以此纪录LeetCode所刷题目。题目描述:示例:思路:本题使用动态规划的方法去求解,我们首先建立一个dp数组,之后进行双层的for循环,dp数组中存储的是在当前位置下最长的递增子序列的长度,之后我们返回dp数组的最大值即可。代码:class Solution: def lengthOfLIS(self, nums: List[int]) -> int: list1 = [1] * len(nums) for i in .原创 2022-05-04 20:59:54 · 267 阅读 · 0 评论 -
力扣每日一题(五十八——周赛题目)
题目描述:示例:思路:代码:d = {"^": (-1, 0),"v": (1, 0),"<": (0, -1),">": (0, 1)}class Solution: def conveyorBelt(self, matrix: List[str], start: List[int], end: List[int]) -> int: m, n = len(matrix), len(matrix[0]) q = de.原创 2022-04-25 13:44:41 · 256 阅读 · 0 评论 -
力扣每日一题(五十七——广(深)度优先遍历算法(关二维平面搜索问题))
仅以此纪录每日LeetCode所刷题目。题目描述:示例:思路:这道题需要同时使用BFS + DFS,因为题目中已经明确说明图中含有两座岛,因此我们首先使用DFS搜索出其中的任意一座岛屿,将这座岛屿的坐标放在一个队列中,下一步我们使用BFS,一个格子一个格子的向外扩充,如果某次碰到了另外一个岛屿,则返回对应的step即可。代码:class Solution: def shortestBridge(self, grid: List[List[int]]) -> .原创 2022-04-22 15:01:38 · 2290 阅读 · 0 评论 -
力扣每日一题(五十六——周末比赛题目)
仅以此纪录每日LeetCode所刷题目(这个周末有一场力扣杯、一场周赛、一场双周赛,真是猪脑过载)。题目描述:示例:思路:这道题我们直接模拟即可,需要注意在计算宝石的一半时,需要向下取整。代码:class Solution: def giveGem(self, gem: List[int], operations: List[List[int]]) -> int: for i in range(len(operations)):原创 2022-04-17 22:43:36 · 3409 阅读 · 0 评论 -
力扣每日一题(五十五——广(深)度优先遍历算法(关二维平面搜索问题))
仅以此纪录每日LeetCode所刷题目。题目描述:示例:思路:关于树的问题,我们很容易区分深度优先和广度优先,但是面对这种平面二维数组的问题。我们一般同时使用深度优先和广度优先搜索。在进行搜索遍历的时候,最重要的是我们要对已经搜索过的地方进行标记,防止重复搜索陷入循环导致程序无法正常运行。这道题我们定义一个深度优先搜索的函数,当找到一个坐标为”1“时,就开始对这个坐标的四周进行搜索,相当于遍历整个”岛屿“,深度优先搜索函数编写的时候要注意边界值和结束条件(1、越界要结束 2、根据原创 2022-04-15 23:08:48 · 2780 阅读 · 0 评论 -
力扣每日一题(五十四——向表达式添加括号后的最小结果)
仅以此纪录每日LeetCode所刷题目。题目描述:示例:思路:这道题的测试用例给出的长度很短,所以不用考虑到会超时。因此我们可以列举出所有“()”的可能性。因为“+”会将字符串分成两部分,括号会将两部分分成四部分,因此我们将分割后的四部分分别命名为(ABCD),记得出的结果为A*(B+C)*D,依次计算,返回最小值所对应的字符串即可。代码:class Solution: def minimizeResult(self, expression: str) ->.原创 2022-04-12 15:22:37 · 1802 阅读 · 0 评论 -
力扣每日一题(五十三——广度优先遍历算法(关于树得类型题))
仅以此纪录每日LeetCode所刷题目。题目描述:示例:思路:这道题我们需要知道一个定理,如果存在最小高度,那么最多只有两个节点。代码:class Solution: def findMinHeightTrees(self, n: int, edges: List[List[int]]) -> List[int]: in_degree, connect = [0] * n, defaultdict(list) for a, b.原创 2022-04-08 22:53:45 · 1789 阅读 · 0 评论 -
力扣每日一题(五十二——数组的三角和)
仅以此纪录每日LeetCode所刷题目。题目描述:示例:思路:这道题通过观察我们可以发现,如果有n个数,那么在(n-1)次变换之后即可得到答案,而在每次变换的时候,每一行的最后一个数都会消失,因此我们这道题可以进行双for循环模拟,注意总和大于十要mod10取余。代码:class Solution: def triangularSum(self, nums: List[int]) -> int: if len(nums) == 1: ..原创 2022-04-04 22:12:01 · 1933 阅读 · 0 评论 -
力扣每日一题(五十一——考试的最大困扰数)
仅以此纪录每日LeetCode所刷题目。题目描述:示例:思路:代码:题目描述:示例:思路:代码:题目描述:示例:思路:代码:原创 2022-03-31 22:02:08 · 1273 阅读 · 0 评论 -
力扣每日一题(五十——找到指定长度的回文数)
仅以此纪录每日LeetCode所刷题目。题目描述:示例:思路:代码:题目描述:示例:思路:代码:题目描述:示例:思路:代码:原创 2022-03-28 22:51:06 · 222 阅读 · 0 评论 -
力扣每日一题(四十九——阶乘后的零)
仅以此纪录每日LeetCode所刷题目。题目描述:示例:思路:这道题我当时的思路是得到n的阶乘res,将res由数字转化成字符,之后将res字符翻转,遍历res的各个字符,当遇到字符不是str(0)时停止,得到答案。但是这个方法的时间和空间都占用的比较多。另外的思路就是求阶乘中5的因子的个数。末尾0其实是任意正整数乘以10产生的,也就是说因子中每出现一个2和一个5,结果就会多一个末尾0。显然连续数字的阶乘里,2的因子个数是远远多于5的因子个数的。那么主要影响末尾0的个数其实是5.原创 2022-03-26 17:05:04 · 568 阅读 · 0 评论 -
力扣每日一题(四十八——字符串转换整数(atoi))
仅以此纪录每日LeetCode所刷题目。题目描述:示例:思路:这道题如果使用Python的正则表达式,可以一行代码完成,但是除了正则表达式这种方法,我们还可以按照题目给出的算法要求一步一步进行。因为题目的算法要求已经写得很明确了,所以我直接放代码了。注:ord()函数返回的是ascⅡ码,用来判断该字符是否为数字。代码:class Solution: def myAtoi(self, s: str) -> int: res = '0' .原创 2022-03-23 18:12:12 · 1329 阅读 · 0 评论 -
力扣每日一题(四十七——统计道路上的碰撞次数)
仅以此纪录每日LeetCode所刷题目。题目描述:示例:思路:这道题一开始的想法是使用模拟来解答,但是如果我们遇到'RRRRL'这种情况,我们在判断‘RL’相撞之后还需要回退到前面,因为前面的'RRRR'也有相撞,因此模拟方法相当麻烦,我们换一种思路。首先,如果directions串的前n个字符是'L',那么他们不会发生碰撞,我们可以将其剔除;同理如果directions串的后n个字符是'R',那么他们也不会发生碰撞,我们可以将其剔除。此时剩余的directions串中,一定会发..原创 2022-03-21 18:35:00 · 2905 阅读 · 0 评论 -
力扣每日一题(四十六——不同的二叉搜索树)
仅以此纪录每日LeetCode所刷题目。题目描述:示例:思路:这道题要返回的形式为:1、该节点存在左右节点:root.val(root.left.val)(root.right.val)2、该节点存在左节点但不存在右节点:root.val(root.left.val)3、该节点存在右节点但不存在左节点:root.val()(root.right.val)总结来说就是没有右节点可以省略右括号,但没有左节点不可以省略左括号。因此这道题使用迭代方法并分成三种情况。分别.原创 2022-03-19 17:28:49 · 2611 阅读 · 0 评论 -
力扣每日一题(四十五——词典中最长的单词)
仅以此纪录每日LeetCode所刷题目。题目描述:示例:思路:今天题的难点在于如何将words列表进行排序,我使用了一个lambda函数,在排序的时候首先按照长度排序,之后长度相同,将字典序大的排在前面。代码:class Solution: def longestWord(self, words: List[str]) -> str: words.sort(key=lambda x: (-len(x), x), reverse=True)原创 2022-03-17 22:54:04 · 231 阅读 · 0 评论 -
力扣每日一题(四十四——四数之和)
仅以此纪录每日LeetCode所刷题目(感觉要线上毕业了...)。今天做的题是以前一道题的变形,上次做这道题还没有开始写博客,这次把他们一起写上去,还可以做一个对比。题目描述:示例:思路:这道题我们需要在给出的nums列表中找到三个数让他们相加为0,一般三搜索我们会暴力的使用三循环,但是这道题使用三重循环会超时。其实我们可以将这道题简化成单循环+双指针的模式。我们首先将数组从大到小进行排序,一层循环遍历所有的数,在剩下的数中我们可以设置左右指针分别指向最小和最大值,这三个数之和.原创 2022-03-16 20:33:56 · 2828 阅读 · 0 评论 -
力扣每日一题(四十三——统计按位或能得到最大值的子集数目)
仅以此纪录每日LeetCode所刷题目(疫情严重了)。题目描述:示例:思路:今天学习了一个新的Python库函数。Python 的itertools库中提供了combinations方法可以轻松的实现排列组合。from itertools import combinationstest_data = ['a', 'a', 'a', 'b']for i in combinations(test_data, 2): print(i)输出:fro...原创 2022-03-15 17:47:35 · 1107 阅读 · 0 评论 -
力扣每日一题(四十二——二叉树的层序遍历)
仅以此纪录每日LeetCode所刷题目(今天的周赛打的巨差)。题目描述:示例:思路:第一次接触和树有关的题目,之前一直是比较排斥的,但是前几天学习了一下使用Python来写树,因此最近做几道关于树的算法题。我的思路是使用队列保存每一层的所有节点,把队列里的所有节点出队列,然后把这些出去节点各自的子节点入队列。以此来完成对每层的遍历。代码:# Definition for a binary tree node.# class TreeNode:# def __原创 2022-03-14 16:17:06 · 682 阅读 · 0 评论 -
力扣每日一题(四十一——统计可以提取的工件)
仅以此纪录每日LeetCode所刷题目(今天的周赛打的巨差)。题目描述:示例:思路:这道题在比赛时我使用的是一种很笨的方法,将所有零件的所谓位置找出来,使用嵌套列表存储,之后依次遍历dig数组,若其中一个不存在则打破循环(count-1),但是很不幸,在倒数第二个测试用例超时了,因此我首先遍历dig,使用二维数组记录每个单元格是否被挖掘。遍历每个工件从左上到右下,只要其中所有单元格被挖掘则可以提取该工件。代码:class Solution: def digArti.原创 2022-03-13 20:54:03 · 1132 阅读 · 0 评论 -
力扣每日一题(四十——蜡烛之间的盘子)
仅以此纪录每日LeetCode所刷题目(该学习了...)。题目描述:示例:原创 2022-03-10 21:01:09 · 204 阅读 · 0 评论 -
力扣每日一题(三十九——将数字变成0的操作次数)
仅以此纪录每日LeetCode所刷题目(今天除夕,祝大家春节快乐。这次的题目是今日的每日一题和上周周赛做出来的两道题)。题目描述:示例:思路:我这道题直接使用模拟方法,根据题目给出的方法,对奇数和偶数分别进行处理,直到num为0时停止循环,进行输出。代码:class Solution: def numberOfSteps(self, num: int) -> int: count = 0 while num != 0: ..原创 2022-01-31 22:55:13 · 3684 阅读 · 0 评论 -
力扣每日一题(三十八——句子中的有效单词数)
仅以此纪录每日LeetCode所刷题目。题目描述:示例:思路:这道题我首先使用spilt将字符串分开,拆分成单词形式,注意有的情况是多空格,因此我们要判断一下单词是否存在,之后使用正则表达式判断即可。代码:class Solution: def countValidWords(self, sentence: str) -> int: count = 0 for i in sentence.split(" "): .原创 2022-01-27 23:00:59 · 3282 阅读 · 0 评论 -
力扣每日一题(三十七——比赛中的配对次数)
仅以此纪录每日LeetCode所刷题目。题目描述:示例:思路:我一开始使用的是模拟的方法,将这一系列的过程依次使用代码描述。总体来说就分成两种情况,当人数是奇数的时候需要先将人数减一代表轮空,当人数是偶数的时候直接除以二代表进行比赛。设置变量count来计算配对数量。代码:class Solution: def numberOfMatches(self, n: int) -> int: count = 0 while..原创 2022-01-27 14:57:09 · 2819 阅读 · 0 评论 -
力扣每日一题(三十六——元素计数)
仅以此纪录每日LeetCode所刷题目题目描述:示例:题目描述:示例:题目描述:示例:原创 2022-01-24 16:14:25 · 1393 阅读 · 0 评论 -
力扣每日一题(三十五——存在重复的元素)
仅以此纪录每日LeetCode所刷题目题目描述:示例:思路:今天的思路比较清晰,但是时间复杂度和空间复杂度都不是很理想。题目给定了一个k值,我们需要判断nums列表中存不存在两个相同的数之间的距离小于k值,遇到有关查找的问题,我们首先想到用哈希表来解决。建立哈希表,key值存储数字,value存储相同数字的下标值。存储完毕之后我们来遍历value值,我们首先判断每个value对应的长度,如果所有的value值都为1,也就是没有重复的数字,那我们直接返回False即可。正常情况下我们.原创 2022-01-19 16:58:34 · 860 阅读 · 0 评论 -
力扣每日一题(三十四——最小时间差)
仅以此纪录每日LeetCode所刷题目题目描述:示例:思路:做这道题之前我们要知道一件事情,一天中有1440分钟,因此timesPoints列表中不同的值最多有1440种。由此可见,列表中很多的值可能是重复的。我们可以使用哈希表,如果列表中有重复的值,也就是某个key对应的value大于1时,我们可以直接返回0。当排除掉这种情况的时候,列表的最大长度也就不会超过1440,因此我们也就不用担心超时的问题了,我们将时间换算成分钟,将小时*60+分钟即可。还需要注意的一点是,1440和0.原创 2022-01-18 17:38:42 · 935 阅读 · 0 评论 -
力扣每日一题(三十三——将字符串拆分为若干长度为k的组)
仅以此纪录每日LeetCode所刷题目(第一次周赛做出两道题...以前都是一道题,希望三道可以快点来)。题目描述:示例:思路:这道题我的思路是先补齐,后分割。我们首先判断字符串的长度是否可以被k整除,可以被整除就代表不需要补齐,不可以被整除就需要补齐。注意补齐的字母题中已经给出。之后就按照k值分割即可。代码:class Solution: def divideString(self, s: str, k: int, fill: str) -> List[st.原创 2022-01-16 17:30:04 · 632 阅读 · 0 评论 -
力扣每日一题(三十二——计算力扣银行的钱)
仅以此纪录每日LeetCode所刷题目。题目描述:示例:思路:这道题可以将其分为两部分,第一部分是算出week的数量,第二部分是算出day的数量。week的数量可以使用int(n/7来求),day的数量可以使用n-week*7来求,之后分类讨论week为0和week大于0的情况。思路比较简单,代码也比较易懂,唯一不足的就是变量使用的太多了。代码:class Solution: def totalMoney(self, n: int) -> int:原创 2022-01-15 19:54:57 · 193 阅读 · 0 评论 -
力扣每日一题(三十一——至少是其他数字两倍的最大数)
仅以此纪录每日LeetCode所刷题目。题目描述:示例:思路:这道题我们只需要找到最大的数和第二大的数即可,我们可以使用python中自带的sorted()函数,排序之后数组下标为-1的数就是最大的数,下标为-2的数就是第二大的数。之后我们判断最大的数是否为第二大的数的两倍即可。特殊情况就是只有一个属的情况下,我们直接返回0。代码:class Solution: def dominantIndex(self, nums: List[int]) -> int:.原创 2022-01-13 12:03:42 · 431 阅读 · 0 评论 -
力扣每日一题(三十——递增的三元子序列)
仅以此纪录每日LeetCode所刷题目。题目描述:示例:思路:这道题我一开始想出了多种方法,三重循环肯定会超时,我尝试将nums列表中的数字和它们的下标作为键值对存入字典中,但是仍然无法做的非常好。之后我选择了用这种方法,只需要遍历一次数组,会找到最小值和比最小值大的值作为中间值。但我们找到比中间值还大的值得时候,就可以返回True了,反之返回False。代码:class Solution: def increasingTriplet(self, nums: Li.原创 2022-01-12 22:37:38 · 107 阅读 · 0 评论 -
力扣每日一题(二十九——连续两字母单词得到的最长回文串)
仅以此纪录每日LeetCode所刷题目(最近堕落了,不能这样嘿嘿)。题目描述:示例:思路:这道题是力扣双周赛里面的一道题,当时做的时候上头了,惨不忍睹。现在看解析感觉自己当时的思路是没错的。官方解析的这段话可以概括两类符合要求的字符串(中间型得和两边型的)其余的我就放在代码的注释里面啦。代码:class Solution: def longestPalindrome(self, words: List[str]) -> int: ...原创 2022-01-10 22:29:40 · 368 阅读 · 0 评论 -
力扣每日一题(二十八——括号的最大嵌套深度)
仅以此纪录每日LeetCode所刷题目。题目描述:示例:思路:这道题的题干比较唬人,仔细理解一下就是常见的左右括号问题。左右括号问题一般使用栈,但是这道题不需要使用栈,题目需要求的最大嵌套深度其实就是遍历字符串时左括号的最大值。我便设置一个变量count,遇到左括号count+1,遇到右括号count-1。遍历的时候实时记录count的值,结果返回最大值即可。代码:class Solution: def maxDepth(self, s: str) -> i.原创 2022-01-07 16:11:07 · 317 阅读 · 0 评论 -
力扣每日一题(二十七——简化路径)
仅以此纪录每日LeetCode所刷题目。题目描述:示例:思路:这道题理解起来比较困难,但是读懂题意之后还是比较好写的,使用栈即可。首先对给出的path进行处理。第一步先将"//"改写成"/",注意题目里面可能会出现“////”这样的样例,因此我们不能使用if来判断,我们需要使用while循环,直到转化完全。因为我们输出结果的时候最后的字符不是"/",因此我们将最后的"/"删除。第二步我们使用split函数,以"/"为分隔符将path分割。遍历分割后的各个元素,删除‘.’,之.原创 2022-01-06 23:15:29 · 334 阅读 · 0 评论 -
力扣每日一题(二十六——替换所有的问号)
仅以此纪录每日LeetCode所刷题目。题目描述:示例:思路:这道题我首先把26个字母放在数组中,虽然题目中说可以随意替换,但是我们还是按照顺序比较好。我们对题目中给定的字符串s进行遍历,遇到"?"就使用字母替换,注意字母不能和前后相邻的字母重复,因此我们讨论一下"?"所在的位置:若出现在开头,则避开第二个字符即可;若出现在结尾,则避开倒数第二个字符即可;若出现在中间,则需要避开前一个字符和后一个字符。最后排除一下特殊情况,那就是字符串中只有"?",出现这种情况我们返回a即可。..原创 2022-01-05 22:56:41 · 309 阅读 · 0 评论 -
力扣每日一题(二十五——n的第k个因子)
仅以此纪录每日LeetCode所刷题目(放假回家了,开始更新)。题目描述:示例:思路:这个思路还是看官方讲解比较好,我讲的可能不是特别清楚代码:class Solution: def kthFactor(self, n: int, k: int) -> int: list1 = [] for i in range(1,int(n**0.5)+1): if n % i ==0 and i not..原创 2022-01-04 18:00:03 · 546 阅读 · 0 评论 -
力扣每日一题(二十四——完美数)
仅以此纪录每日LeetCode所刷题目题目描述:示例:代码(1):class Solution: def checkPerfectNumber(self, num: int) -> bool: count = 0 list1 = [1] if num <= 1: return False else: for i in range(1,int(num..原创 2021-12-31 16:11:03 · 658 阅读 · 0 评论 -
力扣每日一题(二十三——统计特殊四元组)
仅以此纪录每日LeetCode所刷题目题目描述:示例:思路一:奈何本人没文化...一上来就想到了暴力迭代法,不需要什么思路,就是时间复杂度过高代码一:class Solution: def countQuadruplets(self, nums: List[int]) -> int: count = 0 for i in range(len(nums)-3): for j in range(i+1,le.原创 2021-12-29 16:20:35 · 551 阅读 · 1 评论 -
力扣每日一题(二十二——适龄的朋友)
仅以此纪录每日LeetCode所刷题目题目描述:示例:思路:这道题首先想到了暴力迭代法,很快的写出来,果不其然超时了。观察取值范围之后,我发现年龄是0-120岁,相对比较少,因此我们可以使用哈希表来存储每个年龄岁对应的人数。之后我们将哈希表的key值从大到小排序,因为题目中说年龄小的人不会像年龄大的人发送好友请求,所以这样排序可以减少循环的次数。之后我们开始遍历key值,如果说一个年龄有很多人,那他们会相互的发送好友请求(我们从示例一可以看你出),假设某个年龄有n个人,那么他们之间.原创 2021-12-27 12:28:07 · 621 阅读 · 0 评论 -
力扣每日一题(二十一——Bigram分词)
仅以此纪录每日LeetCode所刷题目题目描述:示例:思路:这道题的解题思路比较容易想出,首先我们需要将空格当成分隔符把text字符串分开,将每个单词加入到列表中。之后即可开始循环判断,当第i个单词为first时,若第i+1个单词为second,则在输出列表中加入第i+2个单词,注意控制好循环的范围,防止溢出。代码:class Solution: def findOcurrences(self, text: str, first: str, second: str.原创 2021-12-26 09:54:08 · 288 阅读 · 0 评论 -
力扣每日一题(二十——仅含1的子串数)
仅以此纪录每日LeetCode所刷题目题目描述:示例:思路:这道题其实是一个巧算,想到方法之后代码就非常简单。这个字符串是由0和1组成的,而这道题只和1有关系,我们首先将这个字符串以0为分隔符分割开来。接着我们需要发现一个规律,我们首先举一例子,在'11111'中有一个'11111',两个'1111',三个'111',四个'11',五个'1'我们可以使用循环将他们表示出来:for j in range(1,len('11111') + 1):这个循环 的输出为1 2 3 .原创 2021-12-25 16:32:30 · 309 阅读 · 0 评论