• 从0开始刷力扣


    在这里插入图片描述

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

    在这里插入图片描述


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


    一,数组

    1.1,数组的遍历

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

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


    class Solution {
        public int findMaxConsecutiveOnes(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;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

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


    题号:495,提莫攻击

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


    class Solution {
        public int findPoisonedDuration(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;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

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


    题号:414,第三大的数

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


    class Solution {
        public int thirdMax(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;
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

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


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


    class Solution {
        public int maximumProduct(int[] nums) {
            // 三个指针遍历的做法效率太低
            Arrays.sort(nums);
            int n = nums.length - 1;
            return Math.max(nums[0]*nums[1]*nums[n],nums[n-2]*nums[n-1]*nums[n]);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

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


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

  • 相关阅读:
    micro-app-1-渲染篇
    黑盒(功能)测试基本方法
    Android 接入ttf字体文件
    主动人机交互与被动人机交互
    基于小程序的教学辅助微信小程序设计+ssm(lw+演示+源码+运行)
    热门Java开发工具IDEA入门指南——导出项目到Eclipse
    TLSF——一种高效的内存池实现
    Idea代码上传至Git完整教程(阿里云)
    操作系统实验三虚拟存储器管理之模拟页面置换算法(FIFO&LRU)
    Express实现定时发送邮件
  • 原文地址:https://blog.csdn.net/qq_61688804/article/details/124988819