LeetCode算法题
2021,开始刷题!
Lev_i
随便记住我,然后忘了吧
展开
-
1894. 找到需要补充粉笔的学生编号
1894. 找到需要补充粉笔的学生编号贴个题目:贴个示例:在这里插入代码片解题思路:方法一:一次遍历+模拟读完题目我们可以看出,其实就是循环派粉笔给学生,直到学生拿不到足够的粉笔,这时候就返回学生的位置。那么我们可以先求循环一次学生需要多少支粉笔,然后求出派到最后一轮的时候,剩余的粉笔数。最后就遍历一次数组,一边遍历,一边减少粉笔数,什么时候粉笔数是负数的时候,就证明这一个学生不够粉笔派了,此时返回这一个学生的下标即可。优化:我们可以通过取余数来求出最后一轮的时候剩余的粉笔数,这样子原创 2021-09-10 21:48:30 · 104 阅读 · 0 评论 -
1221. 分割平衡字符串
1221. 分割平衡字符串贴个题目:贴个示例:解题思路:这一道题,我们得注意题目所给出的字符串本来已经是一个平衡字符串,也就是说字符串中‘R’和‘L’的数量是一样的。根据以上细节,我们可以用变量letter统计LR的数量,如果只有一边,就增加letter,如果找到另外一边与其配对,就减少letter。最后每一次letter归0的时候,就有一个平衡字符串。贴个代码:class Solution {public: int balancedStringSplit(string s)原创 2021-09-07 10:31:20 · 69 阅读 · 0 评论 -
470. 用 Rand7() 实现 Rand10()
470. 用 Rand7() 实现 Rand10()贴个题目:贴个示例:解题思路:我觉得有一个题解讲的特别好,大家可以看看他的分析:从最基础的讲起如何做到均匀的生成随机数原创 2021-09-05 22:55:44 · 41 阅读 · 0 评论 -
剑指Offer 10-1.斐波那契数列
剑指Offer 10-1.斐波那契数列贴个题目:贴个示例:解题思路:其实斐波那契数列相信大家也不陌生,他是形如以下的数列:0、 1、1、2、3、5…其实实际上就是第三项等于前两项相加的和。我们可以使用动态规划思想来解决这一道题目,由于第三项是等于前两项相加的和,因此我们设立三个变量first,second,third,来分别存储三个值,然后不断迭代更新,最后返回third即可。那么根据以上思路,我们要注意,数据是否会溢出空间,为了防止数据溢出,题目中其实给出了一个提示:返回值对1e9原创 2021-09-04 19:15:36 · 100 阅读 · 0 评论 -
剑指 Offer 22.链表中倒数第k个节点
剑指 Offer 22.链表中倒数第k个节点贴个题目:贴个示例:解题思路:思路一:使用指针数组储存既然题目要求倒序输出某一个节点,那我们可以用一个指针数组储存所有的指针,然后从尾部返回第k个即可。思路一代码:/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */struct ListNode* getKt原创 2021-09-02 09:15:42 · 59 阅读 · 0 评论 -
611.有效三角形的个数
611.有效三角形的个数贴个题目:贴个示例:解题思路:这道题目,涉及了一个初二的数学知识:三角形的两边之和大于第三边:即:a+b>c也就是这一道题,我们需要做的是,使用两条边,找到第三条边是符合这个条件的,就可以被称为“有效三角形”综上,我们可以排序之后使用双指针,left指针指向第一条边,right指向第二条边,然后寻找符合条件的第三条边,通过移动left和right指针,就可以得出所有的“有效三角形”。特殊情况:当数组的长度小于3的时候,都不能组成三角形,更别提“有效三角原创 2021-08-30 07:33:52 · 472 阅读 · 0 评论 -
1588. 所有奇数长度子数组的和
1588. 所有奇数长度子数组的和贴个题目:贴个示例:解题思路:首先看到题目是计算奇数长度的子数组的总和,因此我们可以通过前缀和的思想来进行求解。具体过程就是:1、首先创建一个长度为arrSize+1的数组nums,nums第一个元素为0,然后求出arr中每一位的前缀和nums[i]=nums[i-1]+arr[i-1];2、紧接着,处理一些特殊情况,我们可以从示例中看出:(1)如果arr长度小于3的时候,只需要返回数组和,因此此时子数组只能由一个元素组成。(2)如果arr长度刚原创 2021-08-29 22:07:25 · 265 阅读 · 0 评论 -
1732. 找到最高海拔
1732. 找到最高海拔贴个题目:贴个示例:解题思路:这道题其实就是利用前缀和的思想,因为是从0海拔开始,因此我们要创建一个新的数组,长度为gainSize+1,模拟自行车手走的每一步之后的海拔高度。贴个代码:int largestAltitude(int* gain, int gainSize){ int arr[gainSize+1]; arr[0]=0; int max=arr[0];//使用max记录最大海拔 for(int i=1;i<gain原创 2021-08-27 10:35:47 · 114 阅读 · 0 评论 -
1480. 一维数组的动态和
1480. 一维数组的动态和贴个题目:贴个示例:解题思路:这一道题很明显就是求这个数组的前缀和,所谓前缀和,就是求当前位置到初始位置的和,由此可以得出:nums[i]=nums[i-1]+nums[i]贴个代码:/** * Note: The returned array must be malloced, assume caller calls free(). */int* runningSum(int* nums, int numsSize, int* returnSize)原创 2021-08-27 10:16:37 · 65 阅读 · 0 评论 -
881. 救生艇
881. 救生艇贴个题目:贴个示例:解题思路:这一道题用到的编程思想是:贪心算法和二分算法。由于每艘船只能载两个人,因此我们只需要分析最重的人和最轻的人能不能做同一艘船就可以。基于以上的思想,我们要将people数组进行排序,然后比较最轻和最重的人能不能载同一艘船,如果可以,就到下一对,如果不可以,就证明最重的人得自己做一艘船。我们可以使用双指针,left指向轻的那边,right指向重的那边,然后如果轻+重小于限制重量,我们就left和right同时向中间移动,否则就只移动right,一边原创 2021-08-26 16:08:00 · 89 阅读 · 0 评论 -
50. Pow(x,n)
50. Pow(x,n)贴个题目:贴个示例:解题思路:这一题,用个开玩笑的做法就是直接return pow(x,n),这是最赖皮的做法。但是题目本来就要求你写一个pow函数,所以我们要用其他方法。直接遍历是可以的,但是呢,会超出时间限制,因此我们要想一种方法,能够减少时间复杂度。收到二分法的启发,我们可以进行类似于以下的计算:x,xx,xxxx……因此就会有递归式:myPow(x*x,n/2)那么上述的递归式,是n为偶数的情况,当n为奇数的时候又应该怎么样呢?由于n为奇数,因此我们可以先原创 2021-08-25 15:57:20 · 103 阅读 · 0 评论 -
58.最后一个单词的长度
58.最后一个单词的长度贴个题目:贴个示例:解题思路:题目要求的是最后一个单词,因此我们可以从后往前遍历,只要是不是空格就length++,是空格就直接break但是看了示例,需要注意的是,有可能一开始就会遇到空格,直接跳出,导致统计的单词长度是0,答案错误发现了以上的问题,我们只需要加上一个判断条件,只有在length!=0的情况下才break贴个代码:int lengthOfLastWord(char * s){ int len=strlen(s); int leng原创 2021-08-25 10:36:16 · 54 阅读 · 0 评论 -
541. 反转字符串II
541. 反转字符串II贴个题目:贴个示例:解题思路:这一道题目,其实就是在原数组上进行模拟反转,最后返回原数组即可。那么首先写一个交换两个字符的函数swap,需要注意的是用一个中间值temp储存其中一个地址,不用指针。然后有一个就是交换函数,利用双指针的思想,我们可以用l指向要交换部分的头部,用r指向要交换部分的尾部,交换一个之后就双指针中间夹,最后循环条件就是当l<r。最后就是根据条件设定交换规则1、每2k个交换前k个2、剩余部分小于k个就全部交换3、剩余部分大于且等于k原创 2021-08-25 09:58:38 · 46 阅读 · 0 评论 -
1646. 获取生成数组中的最大值
1646. 获取生成数组中的最大值贴个题目:贴个示例:解题思路:这一道题目,乍看还以为有什么数学规律,后来才发现利用题目中的条件进行模拟就好,在模拟过程中,使用一个max但是根据官方题解:官方题解:1646. 获取生成数组中的最大值我们可以把题目条件进行化简,贴一个图片:理解应该是没问题的,实现代码在官方题解中有提到,就不赘述。贴个代码:int getMaximumGenerated(int n){ if(n==0) return 0; int nums[n+1];原创 2021-08-24 15:19:45 · 64 阅读 · 0 评论 -
443. 压缩字符串
443. 压缩字符串贴个题目:贴个示例:解题思路:这一题主要思想就是双指针1、left定位当前数据,然后right就往后找,如果字符与left相同,那就right就向后移动。2、统计相同字符结束之后,更新left指针到right处,然后right要更新到left右边一个那么根据题目要求,我们还需要index记录每一次压缩字符之后的坐标,然后复制当前正在统计的字符以及他的数量...原创 2021-08-22 23:42:59 · 55 阅读 · 0 评论 -
264. 丑数 II
264. 丑数 II贴个题目:贴个示例:解题思路:这道题目,默认第一个丑数是1,那么其实就是使用动态规划,让每一位乘2、3、5,并且选取其中的最小值。那么我们就定义三个指针,p2、p3、p5分别代表质因数2、3、5,下一个丑数就是当前指针指向丑数乘对应的质因数得到的。意思就是说,如果你这一次指针选择了乘2,那么p2就要向下一位类推,若这一次指针选择了乘3,那么p3就要向下一位若这一次指针选择了乘5,那么p5就要向下一位最后return 最后一个就好贴个代码:int nthUglyN原创 2021-08-17 21:25:06 · 61 阅读 · 0 评论 -
551. 学生出勤记录 I
551. 学生出勤记录 I贴个题目:贴个示例:解题思路:首先看只有同时满足两个条件才能满足,那么我们就是遍历一次,判断这两个条件,一旦有一个条件不成立,就return false,最后遍历完成之后,如果都没有违背这两个条件就return true。贴个代码:bool checkRecord(char * s){ int len=strlen(s); int absent=0; int late=1; for(int i=0;i<len;i++)原创 2021-08-17 01:18:57 · 59 阅读 · 0 评论 -
263.丑数
263. 丑数贴个题目:贴个示例:解题思路这题才是真正的简单题,之前力扣的简单题都是些什么玩意儿根据丑数的定义:质因数只有2、3、5的数那么我们知道只需要n一直整除这三个数,最后n==1的时候,n就是丑数注意当n为负数或0的时候,一定不是丑数根据以上分析,我们可以写出代码:贴个代码:bool isUgly(int n){ if(n<=0) return false; while(n%2==0) n/=2; while(n%3==0) n/=3;原创 2021-08-16 22:46:42 · 43 阅读 · 0 评论 -
1137.第N个泰波那契数
1137. 第N个泰波那契数贴个题目:贴个示例:解题思路:这一题和斐波那契数列数列其实本质上是一样的,不过多了一个变量而已,相信大家都做过斐波那契数列,知道有两种方法:1、动态规划,2、递归1、动态规划:首先我们来介绍动态规划,为什么要用动态规划呢?因为动态规划比递归更加省时间,它能够减少递归那些重复计算的步骤。我们使用t1代表第一个变量,t2代表第二个变量,t3代表第三个变量,中间应该用一个temp存储t3的值,因为t3=t1+t2+t3的时候会把t3给覆盖掉。其实就是利用滚动数组的原创 2021-08-08 10:22:25 · 52 阅读 · 0 评论 -
167. 两数之和 II - 输入有序数组
167. 两数之和 II - 输入有序数组贴个题目:贴个示例:解题思路:1、双指针:由于这是一个已经排好序的数组,因此两数相加==target,那么那两个数肯定是一个在左边,一个在右边,我们只需要弄两个指针,一个从头,一个从尾,向中间靠拢,直到找出两数之和的对应下标即可贴代码:/** * Note: The returned array must be malloced, assume caller calls free(). */int* twoSum(int* numbers,原创 2021-08-07 11:17:37 · 79 阅读 · 0 评论 -
581. 最短无序连续子数组
581. 最短无序连续子数组贴个题目:贴个示例:解题思路:1、 排序+对比数组:题目要求我们找最小的连续子数组,,而且这个最小的连续子数组排序之后能够让原数组升序,那么我们可以复制这个数组numcpy,然后进行排序升序,让result等于数组长度,从头遍历剪掉头,从后遍历剪掉尾,最后得判断result,如果result小于0,那就说明整个数组已经排好序了,所以返回0,大于0就返回result。2、代码://qsort的compare函数:升序排序int compare(const voi原创 2021-08-06 14:21:05 · 159 阅读 · 0 评论 -
1736. 替换隐藏数字得到的最晚时间
1736. 替换隐藏数字得到的最晚时间贴个题目:贴个示例:解题思路:这题其实没什么变化,感觉没好说的,就把所有的情况都包括起来了就行。冒号后面的分钟最大值必然是59,无论如何都不会变的重点是在冒号前面:如果小时第一位是2,那么分最大是3,否则最大是9如果两位同时为?,那么直接最大就是23贴个代码:char * maximumTime(char * time){ //如果小时同时为?,那么最大是23 if(time[0]=='?'&&time[1]=='?原创 2021-07-24 18:20:16 · 50 阅读 · 0 评论 -
1893. 检查是否区域内所有整数都被覆盖
1893. 检查是否区域内所有整数都被覆盖贴个题目:贴个示例:解题思路:第一种:暴力AC法+哈希表使用哈希表对二维数组中的范围进行记录,然后从left遍历到right,如果都有记录,就返回true,一旦一个没有记录那就返回false贴个代码:bool isCovered(int** ranges, int rangesSize, int* rangesColSize, int left, int right){ int arr[52];//题目有给定长度 memset(ar原创 2021-07-23 22:13:03 · 70 阅读 · 0 评论 -
剑指 Offer 52. 两个链表的第一个公共节点
剑指 Offer 52. 两个链表的第一个公共节点贴个题目贴个示例解题思路:这一道题我觉得官方题解解释的很清楚,大家可以参考一下:两个链表的第一个公共节点其中证明是十分精彩的:贴个代码:/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */struct ListNode *getIntersectionNo原创 2021-07-21 22:01:54 · 45 阅读 · 0 评论 -
69. x的平方根
69. x的平方根贴个题目:贴个示例:解题思路:这一题,一开始想到的就是简单粗暴直接从1~x遍历,但是会超时,因此考虑到遍历过程中出现了升序的序列,因此可以用二分查找这里的二分查找返回的是右边界,因此需要-1还有0和1这两个特殊值需要特殊的照顾贴个代码:int binarySearch(int num){ if(num==1) return 1;//特殊情况特殊处理 if(num==0) return 0; int left=0; int right=n原创 2021-07-20 23:08:14 · 47 阅读 · 0 评论 -
1877. 数组中最大数对和的最小值
1877. 数组中最大数对和的最小值贴个题目:贴个示例:解题思路:吐槽一下:经典我看不懂题目想让我干嘛?但是看懂了又很简单?什么叫做:“最大数对和最小”?后来结合示例想一想,应该是让数对的组成平均的前提下,求出最大数对和。什么叫做数对组成平均呢?我是这么理解的,就是数对比较对称,看示例2大概就能明白我的意思。那么搞清楚题意之后,其实就很简单啦:先排序,然后排序,然后求关于数组中间对称的数对和最大值贴代码:int cmp(const void *a,const void *b)原创 2021-07-20 19:14:39 · 56 阅读 · 0 评论 -
剑指offer 42. 连续子数组的最大和
剑指offer 42. 连续子数组的最大和题目简介:题目示例:解题思路:这一题求连续子数组的最大值,可以把问题归类于局部最优解,也就是说这一题我们使用的方法就是动态规划。动态规划问题,最重要的是就是找出动态规划方程,开始分析问题:连续的子数组,其实就是确定是要前面的子数组还是重新开始一个子数组,因此状态方程应该是:dp(i)=fmax(dp(i−1)+nums[i],nums[i])根据状态方程可知:1、从具体实现步骤来讲,我们需要确定,到第i个元素,下一个加不加,因此有:curr原创 2021-07-17 21:39:54 · 56 阅读 · 0 评论 -
34. 在排序数组中查找元素的第一个和最后一个位置
34. 在排序数组中查找元素的第一个和最后一个位置贴个题目:贴示例:解题思路:这一道题的解题思路其实和我之前做过一个题目是一样的,只是返回值不同,具体可以看:剑指 Offer 53 - I. 在排序数组中查找数字 I只是多了一个判断下标是否符合规则,下面直接贴代码。贴代码:/** * Note: The returned array must be malloced, assume caller calls free(). */int binarySearch(int *nums,i原创 2021-07-16 21:41:56 · 56 阅读 · 0 评论 -
剑指 Offer 53 - I. 在排序数组中查找数字 I
剑指 Offer 53 - I. 在排序数组中查找数字 I贴个题目:贴个示例:解题思路:第一种:暴力解题法暴力解题,我直接遍历数组,统计有多少个代码:int search(int* nums, int numsSize, int target){ int sum=0; for(int i=0;i<numsSize;i++) { if(nums[i]==target) sum++; } return sum;}性能分析:原创 2021-07-16 21:18:07 · 91 阅读 · 0 评论 -
645. 错误的集合
645. 错误的集合贴个题目:贴个示例:解题思路:哈希表法:首先来读一下题目:题目意思就是我本来有一个包含1~n的数组,顺序不定,但是呢被一个集合打乱且复制其中一个元素,形成了新的数组请我们找出这个重复元素和缺失的元素那么由上可以得出,新建一个数组reNums,长度为2:int *reNums=(int *)malloc(sizeof(int)*2)*returnSize=2然后用哈希表,统计原数组的元素重复元素个数是2,没有出现的元素个数应该为0根据这个我们就可以找到那重原创 2021-07-15 16:29:38 · 64 阅读 · 0 评论 -
1846. 减小和重新排列数组后的最大元素
1846. 减小和重新排列数组后的最大元素前言:这是一道不应该是中等题的简单题,因为确实常规方法也能做出来我就用了两种方法,一种就是排序+贪心,另外一种就是计数(哈希?)+贪心贴个题目:代码示例解题思路第一种:排序+贪心算法首先我们先排序,然后根据题目说第一个元素必须为1,因此有arr[0]=1紧接着因为求的是最大值,根据贪心算法,我们让每一元素都满足以下条件即可:abs(arr[i] - arr[i - 1]) <= 1最后返回最后一个元素就可以了第一种代码:原创 2021-07-15 10:55:42 · 89 阅读 · 0 评论 -
1818. 绝对差值和
1818. 绝对差值和前言:这题其实挺简单的,我的简单意思是,他可以用简单粗暴的方法做,那么用这种方法做呢,肯定是要用双循环的,那么时间复杂度就是O(nn),那对于这一题的要求来说,对不起,你必定超时(别问我怎么知道,因为我试过)。因此对于找替换元素那里的双循环,用二分查找,就可以省一点时间,时间复杂度就可以控制在:O(nlogn),这样子就不会超时啦贴个题目:贴个示例:解题思路:首先,看到题目,让我们算一个nums1[i]-nums2[i]的和,但是!有一个条件:nums1中可以用原创 2021-07-14 21:22:18 · 313 阅读 · 0 评论