5.27 leetcode解题记录

485-最大连续1的个数

题目描述:给定一个包含0或1的数组,计算其中最大连续1的个数。

解题思路:数组中只存在0或1,当前数组项为0时,表示上一个1的子串结束,此时判断是否更新max 也就是最大连续1的子串的长度,并将当前记录子串的n置为0;当前为1则n++;

注意点:需要判断数组遍历结束时最后一个n与max的对比,保留较大值;

代码描述:

//伪代码
遍历数组{
    if(nums[i] === 0){
        max = Max(n,max);
        n = 0;
    }else{
        n ++;
    }
}
//最后一个n判断
max = Max(n,max);
return max;

495-提莫攻击

题目描述:给定一个数组,升序表示受到攻击的时间节点,数值duration表示中毒的持续时长,计算总的中毒时间;

从题目可以了解到:

  • 受到攻击时立即进入中毒状态,则受攻击的1s也作为中毒时间计算;
  • 每个时间点表示受到攻击,中毒状态不叠加,所以每个受到攻击的时间节点都会重新计算中毒时间,两次中毒叠加的时间不重复计算;

解题思路:遍历数组,将当前时间和下一个时间点之差与duration作比较,前者更大则总时间sum+=两数之差,反之sum+=duration;在上一次攻击的持续时间中再次攻击,则由于中毒状态不重叠,则不计算重叠时间,直接开始计算下一次攻击的中毒时间。或者可以理解为上一次中毒立即停止,不再计算持续时间。

代码描述:

//伪代码
遍历数组{
    // 判断是否为数组最后一项,直接加上duration值
    sum += duration;

    计算当前数组项与下一个数组项之差 gap
    if(gap >= duration){
        sum += duration;
    }else{
        sum += gap;
    }
}
return sum;

414-第三大的数

题目描述:给定一个数组,求出数组中第三大的数,如果不存在则返回数组中最大的数;

注意点:数组中第三大的数是指按照数值排在第三的数,而不是根据排序顺序为第三的数,需要注意出现的重复数字;

解题思路:遍历数组,使用计数器count计算有效数字的个数,作为判断是否存在第三大的数的依据;使用三个变量max、mid、min记录前三大的数,每个数组项与三个变量进行比较,根据比较的 情况依次更新三个数;

代码描述:

//伪代码
遍历数组{
    if(当前数组项num与max、mid、min都不相等){
        count ++;
        if(num > max) 更新min、mid、max;
        else if(num > mid) 更新min、mid;
        else if(num > min) 更新min;
    }
}
return count > 3 ? min : max;

如何记录有效数字的个数?

  • 使用count计数器,当且仅当数组项与当前三个变量均不相等时,count++;
  • 对max、mid、min初始化为 -MAX_VALUE,只要当前数组项与三个变量均不相等
    • 三个变量可能为仍初始值,则表示当前数组项为有效数字;
    • 如果三个变量不是初始值,则表示count的值大于等于3,则存在第三大的数,也可以起到判断是否存在第三大数字的作用;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值