- 博客(61)
- 收藏
- 关注
原创 LeetCode.3146.两个字符串的排列差
优化后的思路二:我们使用两个字典将s和t中每个字符对应的下标存储起来,然后遍历s或者是t字符串,将当前字符在两个字典中对应的值进行取差的绝对值。这样我们就相对于暴力解法优化了很多,但本身因为输入实例不多,所以时间上二者不会差很大
2024-08-24 17:24:40
451
原创 LeetCode.55.跳跃游戏(贪心算法思路)
思路:要判断最后我们是否能到达最后一个位置,我们可以选择遍历数组,使用贪心的思路,找在每个位置时能到达的最远距离,最开始我们在0,可以达到的最远距离为nums[0],遍历数组,如果位置 'i' 在当前的最远距离范围内,我们比较当前最远距离和(i + nums[i])取更大的那个,进行最远可达位置的更新,在这个过程中,一旦最远可达位置超过或等于最后的位置,我们就可以retur True,否则我们返回False。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标
2024-08-23 18:15:13
546
原创 LeetCode.209.长度最小的子数组
优化后:使用滑动窗口, left和right为我们的左右区间,current_sum为该区间的值的总和,我们先从下标为0的值开始加,right往后走,直到区间的总和>=target,这时我们再对左侧进行删减以减少区间长度,left往后移,最小长度我们使用min_length = min(min_length,right - left + 1)实现,当前长度与原来最小长度取最小值。这样最后我们left和right围成的区间是满足条件的且长度最小的
2024-08-22 18:21:31
475
原创 LeetCode.80.删除有序数组中的重复项II
我们从后往前遍历,使用一个变量用于存储当前数字有多少个,如果当前数字数量超过两个,那我们选择数组合适的一个子区间然后将这个子区间全部删除,只保留两个数字即可。最后返回删除完之后数组长度
2024-08-19 19:21:54
355
原创 LeetCode.551.学生出勤记录I
对于这道题我们只需要遍历s,使用一个变量absent用来表示A的出现次数,当absent等于2的时候我们就可以之间返回False了;然后我们还要考虑是否有三个连续的L,最直接的方法就是判断s[i] == 'L' and s[i+1] == 'L' and s[i+2] == 'L',注意这里的i
2024-08-18 18:23:11
392
原创 LeetCode.3137.K周期字符串需要的最少操作次数
让我们找到最小操作数,对于这道题我们可以这样理解:每k个字符作为一个字串整体,我们可以把word分成n//k(n是word长度)个子串整体,比如'word = "leetcoleet", k = 2',我们就可以分成5个字串整体“ 'le''et''co''le''et' ”,最后就是要把这五个子串变成一样的子串。既然是最少操作数,我们就把所有的子串变成原来word中最多数量的那一个子串整体,所以我们需要找到word中出现做多的子串整体数量,这个可以用字典实现,key为子串,value为子串出现数量。
2024-08-17 15:51:46
316
原创 LeetCode.22。括号生成
对于这道题目我们可以用回溯法,创建一个函数backtrack(当前字符,左括号数量,右括号数量),这个函数用来递归生成所有的括号组成可能。我们先前创立一个空列表,在backtrack递归过程中满足条件的我们放到列表中,最后返回列表
2024-08-16 16:48:47
404
原创 LeetCode.20.有效的括号
这道题目我们可以使用栈来解决,建立一个空列表stack,这个栈我们用来存放左括号。遍历字符串s,如果当前符号是左括号我们就放到栈里面。如果当前是右括号,(栈不空的情况下)我们取出最后一个存放到栈中的左括号看是否与当前右括号对应——因此我们可以建立一个字典用来存储括号的对应关系,如果对应我们就接着往下遍历;如果当前栈为空或者取出来的左括号不与当前右括号对应我们就返回False。最后return的时候我们还要看栈是否为空,如果为空我们返回True,如果不为空说明左右括号数量并不匹配我们返回False
2024-08-15 22:50:46
298
原创 LeetCode.3152.特殊数组II
另一种思路:queries中每一个列表元素中有fromi和toi两个元素,也就是nums数组的fromi下标一直到toi下标,我们可以新建一个列表dp用来存储toi下标之前到toi 有多少个满足特殊数组条件的元素,【比如:nums=[1,2,3,4,2],dp[3] = 4,就是在nums[3]及其之前有连续的四个元素满足特殊数组条件,而dp[4] =1,在nums[4]及其之前只有一个元素满足特殊数组】,所以我们初始化dp值都为1,然后我们比较dp[toi]的值 和 fromi与toi之间的距离,如果是d
2024-08-14 18:33:57
438
原创 Leetcode.3151.特殊数组I
思路:这是一道简单题我们就使用最直接的思路:遍历数组(第一个元素到倒数第二个元素),然后判断当前元素与下一个元素是否具有相同的奇偶性(都对2取余来判断),我们用一个变量flag来表示这个列表中是否有连续的元素有相同的奇偶性,flag初始值设置为1是因为如果列表长度为0或者1的时候它肯定没有连续的元素,我们要返回true。如果当前列表中有连续的元素有相同的奇偶性我们令flag=0,最后根据flag的值我们返回True 或者 False即可
2024-08-13 23:14:03
305
原创 LeetCode.676.实现一个魔法字典
判断当前单词是否在词典中的方法:遍历词典中的所有元素,如果当前词典元素与当前的单词长度不同我们之间跳过这层循环开始找下一个词典元素比;如果两者长度相同我们来找他们有几个不同的字母,使用judge变量来表示二者有几个字母不同,初始值为0。使用zip函数取当前词典元素和当前单词的每一个字母进行逐个对比,如果字母不同我们judge的值就加一,judge的值超过一我们就结束当前循环找下一个词典元素,如果对比完这两个单词后judge=1,就说明改完一个字母可以在词典中找到,返回True,否则False
2024-08-12 23:05:38
393
原创 LeetCode.1035.不相交的线
不难发现其实这道题目就是让我们找nums1和nums2两个列表的最长公共子序列的长度,那么我们可以用动态规划的方法:令m,n分别为nums1和nums2的列表长度,定义一个dp二维数组(m+1)*(n+1),初始化dp[i][j]=0,我们找最长公共子序列的长度有以下公式
2024-08-11 17:27:44
283
原创 LeetCode.2940.找到Alice和Bob可以相遇的建筑
我的思路是先定义一个长度为len(queries)的全为-1的列表ans,然后遍历queries里的每组元素,然后找alice和bob哪个在右边,然后从在右边的那个下标为起始开始遍历heights列表直到遇到一个满足条件的建组就结束这次循环,开始找下一组
2024-08-10 23:59:21
445
原创 LeetCode.3132.找出与数组相加的整数II
我们先对两个列表元素进行排序,这样更便于我们找到x,题目中要求我们在nums1中删除两个元素后都加x才能与nums2匹配,那么我们可以确定,我们在nums1中找三个元素,那么这三个元素肯定至少有一个是满足不被删除的,既然它不用被删除,那他与nums2中对应元素相减得到的就可能是我们的x......
2024-08-09 23:53:12
433
原创 LeetCode.3131.找出与数相加的整数I
思路一:不难发现,如果整数x是一定存在的,那么nums1数组的所有元素+x得到的是nums2数组的所有元素,也就是说nums1的所有元素之和+n*nums1(或者是nums2)的长度 = nums2的所有元素之和。
2024-08-08 23:11:38
342
原创 LeetCode.27.移除元素
思路:这道题目思路很明确,我们只需要将nums数组中不等于val的留下来就行了,初始化k=0,遍历数组,如果nums[i]!=val,nums[k++] = nums[i]即可。
2024-08-06 23:53:00
443
原创 LeetCode.600.不含连续1的非负整数
我们要计算在[0, n]范围内不包含连续1的非负整数个数。我们可以将这个问题分为以下几个步骤:n转化为二进制观察它位数。如果一个数的末位是0,那么前面的部分可以是任意的有效数,如果末位是1,那么前面的部分必须以0结尾,以避免连续的1。我们可以利用类似于斐波那契数列的规律来计算有效数字的数量:如果我们有k位的数字,所有的有效数字数量由以下规则得出历史有效数的组合:fib[n] = fib[n-1] + fib[n-2]
2024-08-06 00:07:27
366
原创 LeetCode.572.另一棵树的子树
这道题目不绕,我们只需要使用深度优先搜索,遍历root树,然后找subroot是否与root本身、或与其左子树或者是右子树上的一部分相同,我们使用递归方法。构建一个函数isSubtree2,将root和subroot两个树作为参数,如果root为空我们返回False,如果root与subroot树相同我们就返回True,这两种情况讨论完我们就递归root的左子树或者是右子树看它是否与subroot树相同。所以我们还需要一个用来判断两个树是否相同的函数isSameTree
2024-08-04 23:15:24
368
原创 LeetCode.3128.直角三角形
思路:其实对于这道题目,将问题转化一下,我们只需要遍历每行每列,找当前这个‘1’能组成多少个‘直角三角形’就可以了,而当前这个‘1’能构成的‘直角三角形’的数量就等于他所在的这一行的‘1’的数量减一(减去他自己)乘他所在的这一列的‘1’的数量减一,比如实例一的第二行第二列的‘1’由他为拐角的直角三角形的数量为2*1个,所以,我们先找到每行每列有多少个1,定义起始数量count=0然后遍历矩阵,将当前‘1’为拐角的直角三角形数量累加即可。
2024-08-03 00:05:40
551
原创 LeetCode.40.心算挑战
思路:这道题目让我们计算由cnt个数组成的最大偶数和,我们可以先对列表进行倒序排序,然后我们把前cnt个加起来如果是偶数,那我们直接返回就好了。如果不是,我们选择删除前cnt个中最小的偶数,然后在剩下的cards里面选择一个最大的奇数;以及删除前cnt个中最小的奇数,然后在剩下的cards里面选择一个最大的偶数;将这两种情况取一个最大值来作为我们的答案即可。
2024-08-01 14:14:59
348
原创 LeetCode.3111.覆盖所有点的最少矩阵数目(中等)
这一题所给的数组的每个元素的y值其实并不影响我们做题,以为题目只要求了矩阵跨越x轴的范围是宽度不超过w,不限制我们的y轴,所以我们只需要考虑x轴就好了,我们对数组按照x的大小进行排序,然后进行遍历循环,在每次循环我们先建立一个矩阵,他的x1是points[i][0],x2是x1+w(以为要最少矩阵数量,所以我们的矩阵都取最宽值),然后找满足在[x1,x2]范围之间的点,并更新下标,直到不满足的我们就进入到下一次循环再创建一个新矩阵了
2024-07-31 23:09:29
358
原创 LeetCode.2961.双模幂运算(中等)
思路:对于这道题思路还是非常清楚的,我们只需要遍历题目给的列表,然后看每一个列表元素的四位数字是否满足条件就可以了,因为要把下标存储起来,我们建立一个新的空列表用于存储下标,然后创建一个新变量用来记录下标,最后把我们建的列表返回就好了。
2024-07-30 15:12:30
293
原创 LeetCode.682.棒球比赛(简单)
思路:这道题目思路很简答,都在题目中提到了,我们可以创建一个新的空列表,'D'就把前元素的前一个二倍放到新列表中,+就+前两个元素的和放到列表,C我们就撤销一个添加的元素(或者把前一个加入的元素删除),正常的数字我们就加入到列表中,需要注意的是,加入列表的元素一定是整型。
2024-07-29 12:56:33
385
原创 LeetCode.699.掉落的方块(困难)
思路:对于这道题目,我们需要遍历每个小方块,知道它的左右区间以及高度,对于后面落下来的方块我们还需要判断它是否落在之前下落的小方块上面,所以我们用一个数组square[[left,right,height]]来存储之前下落的小方块信息来判断是否落在之前的小方块上。定义current_height记录当前小方块落下来时候的高度,max_height记录当前小方块落下来之后的最高高度,将当前小方块信息放在square列表中,每遍历一个小方块返回一个当前最大值到目标列表里即可。
2024-07-28 14:51:48
292
原创 LeetCode.3106.满足距离约束且字典序最小的字符串(中等)
计算字符之间的最小距离:字符 ‘a’ 到 ‘z’ 按循环顺序排列,对于两个字符,计算它们之间的最小距离。,对于每个字符,尝试将其修改为字典序更小的字符(尽量是 ‘a’),直到。返回一个字符串,表示在执行一些操作后你可以得到的。:每次修改字符时,计算修改后增加的距离,更新。用贪心策略:从左到右遍历字符串。
2024-07-28 00:58:34
509
原创 LeetCode.2740.找出分区值(中等)
思路:这个题目要求我们返回这个数组里面相差最小的两个数的差就行了(题目中长度肯定是大于等于2的),如果直接暴力法用两层循环找每两个数的差取最小的那个可能会超时,所以我们先用sort函数对数组排序,然后让每两个相邻的数字取差的绝对值,返回最小的就好了。(实例有给的最小差值非常大,所以我们的min_ans一定要定义为无穷大)
2024-07-26 19:00:45
335
原创 LeetCode.18.四数之和(中等)
思路:直接用好几层循环肯定会超时的,所以仍旧选择双指针,和三数不同的就是我们需要两层循环固定前两个数,为了避免重复,我们需要对数组进行排序,然后相邻的两个数字相同我们就移动指针或者是跳过这次循环,如果四个数和为target,我们右移left指针,左移right指针,如果大于target,因为我们是升序排序所以只需要左移right;如果小于target我们需要右移left指针
2024-07-25 14:12:19
207
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅