0


从0开始刷力扣

在这里插入图片描述

🎉🎉🎉写在前面:
博主主页:🌹🌹🌹戳一戳,欢迎大佬指点!
博主秋秋:QQ:1477649017 欢迎志同道合的朋友一起加油喔💪
目标梦想:进大厂,立志成为一个牛掰的Java程序猿,虽然现在还是一个小菜鸟嘿嘿
-----------------------------谢谢你这么帅气美丽还给我点赞!比个心-----------------------------

在这里插入图片描述


从0开始刷力扣

推荐一篇规划刷题顺序的文章,如果有小伙伴和我一样不知道咋刷题,可以去康康哦! 戳戳这里>>>


一,数组类

1.1,数组的遍历

题号:485,最大连续1的个数

在这里插入图片描述
✅题目传送门,戳戳开始解题>>


classSolution{publicintfindMaxConsecutiveOnes(int[] nums){int count =0;int max =0;for(int i =0;i < nums.length;i++){if(nums[i]==1){
                count++;}else{
                count =0;}if(count > max){
                max = count;}}return max;}}

这个题考察的就是数组的遍历以及你的观察能力,注意这是一个二进制的一维数组,正如提示里面所言,数组元素它不是0就是1,那我们要统计连续1的个数,遇到1就把count++,并且同步保存到max里面,如果数组元素为0了,就把count清零,又重新继续往后统计,当然之前max还是一直存储着遇到0之前的连续1的个数,后面只要又实时比较更新max就好了。


题号:495,提莫攻击

在这里插入图片描述
✅题目传送门,戳戳开始解题>>


classSolution{publicintfindPoisonedDuration(int[] timeSeries,int duration){int ret =0;int end =0;//记录理论上的中毒结束时间for(int i =0;i < timeSeries.length;i++){if(timeSeries[i]>= end){
                ret += duration;}else{
                ret += timeSeries[i]+ duration - end;}
            end = timeSeries[i]+ duration;}return ret;}}

其实这个问题也不要想的太过于复杂,就是一个中毒时间累加计算的问题,唯一需要我们注意的就是重置中毒效果的问题。我们每次收到一次攻击,中毒的时间就会是duration,所以我们先不考虑我们中间时间会有重叠的情况,先把所有的duration加起来,然后再把每次的重叠的部分减去,那最后就是我们的实际中毒时间了。
那把这个想法放到每一次攻击上,end是记载我们的理论中毒结束时间(不考虑中间受到攻击,以及end这个时刻其实不是中毒状态的),所以我们的
timeSeries[i] >= end,那就不存在什么中间有重叠的情况,直接攻击了多少次,把duration累加就好,当然每算一次end就会更新,当不满足timeSeries[i] >= end这个条件的时候,就说明在中毒生效的时间段类受到了攻击,所以这个时候按理来说我们的中毒时间就不能再单纯加上duration了,因为此时的攻击时间与上一次的中毒时间是重叠的,这个部分是必须要减掉的,那这个重叠的部分怎么算,就是timeSeries[i] - end,这个算出来结果就是负的,加上的效果就是减了。


题号:414,第三大的数

在这里插入图片描述
✅题目传送门,戳戳开始解题>>


classSolution{publicintthirdMax(int[] nums){if(nums.length ==1){return nums[0];}if(nums.length ==2){return(nums[0]> nums[1])? nums[0]: nums[1];}Arrays.sort(nums);int ret =0;int count =0;int tmp =Integer.MAX_VALUE;for(int i = nums.length -1;i >=0;i--){if(nums[i]!= tmp){
                count++;}
            tmp = nums[i];if(count ==3){break;}}if(count ==3){return tmp;}else{return nums[nums.length -1];//数组没有第三大的数字,例如 2 2 2 2 2 8;}}}

先单独列两种特殊的情况,数组只有两个数,或者数组只有一个数,这个时候求第三大的数都是比较简单的。排除这两种情况外,先把数组排序,这样数组就是按从小到大的顺序排列的,从数组的末尾开始遍历,只要不和tmp相等,我们的计数变量count++,直至找到那个第三大的数。利用到count的原因就是因为元素有重复的可能,所以我们排序好了,倒数第三个数并不一定是第三大的数。


题号:628,三个数最大乘积
在这里插入图片描述
✅题目传送门,戳戳开始解题>>


classSolution{publicintmaximumProduct(int[] nums){// 三个指针遍历的做法效率太低Arrays.sort(nums);int n = nums.length -1;returnMath.max(nums[0]*nums[1]*nums[n],nums[n-2]*nums[n-1]*nums[n]);}}

先将数组排序,乘积最大有三种情况:
1,数组后三个数全是正数,那乘积最大就是就是这后三个数的乘积。
2,数组后三个数全是负数,那乘积最大也是最后三个数的乘积。负数的大小比较与正数相反
3,数组最后三个数里面有正有负,那就只能是最小的两个负数与最大的正数的乘积。
所以综合考量,那就是整合一下用Math.max求最大值就好,就包含了以上的情况。


最后,今天的文章分享比较简单,就到这了,如果大家觉得还不错的话,还请帮忙点点赞咯,十分感谢!🥰🥰🥰
在这里插入图片描述

标签: leetcode 算法 java

本文转载自: https://blog.csdn.net/qq_61688804/article/details/124988819
版权归原作者 影子,你陪着我累吗? 所有, 如有侵权,请联系我们删除。

“从0开始刷力扣”的评论:

还没有评论