895.最大连续的1.
给定一个二进制数组, 计算其中最大连续 1 的个数。
示例:
输入:[1,1,0,1,1,1]
输出:3
解释:开头的两位和最后的三位都是连续 1 ,所以最大连续 1 的个数是 3.来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/max-consecutive-ones
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:
1.找到第一个1的位置 a [ i ]
2. a [ i ] 是否== a [ i+1 ] (等于的话返回 count,不等于的话开始找第二个1的位置,同时返回max。)
3.重复第二步
4.如果第二个max比第一个大,那么就返回新的max
class Solution {
public int findMaxConsecutiveOnes(int[] nums) {
int max = 0; int count = 0;
for(int i=0;i<nums.length;i++){
if(nums[i]==1) count++;
else{
if(count>max)max=count;
count = 0;
}
}
if(count>max)max=count;
return max;
}
}
关于代码优化:else这里是nums [ i ] == 0 的情况,这样就会导致一种情况,也就是如果最后一个元素是1的话,那就不会返回一个新的max值。所以才需要在for循环之外加一个if判断语句。
优化的话,在参考leetcode评论的基础上,可以把else去掉,这样就可以一并去掉for循环之外的判断语句。
时间复杂度是O(n),空间复杂度是O(1)
通过leetcode评论的研究,我发现还有利用双指针写的方法
class Solution {
public int findMaxConsecutiveOnes(int[] nums) {
if(nums.length == 0) return 0;
int fast = 0,slow = 0;
int num = 0;
while(fast < nums.length){
if(nums[fast]==0) {
num = (fast - slow) > num ? fast - slow : num ;
slow = fast + 1;
fast++;
}else{
fast++;
}
}
num = (fast - slow) > num ? fast - slow : num ;
return num;
}
}
这里把方法写在这里,也值得看一看。这个思路在写题目的一瞬间,脑子里也想到了,就是找数组中0的位置,然后用0的位置减去前一个0的位置,进行比较。
495.提莫攻击
在《英雄联盟》的世界中,有一个叫 “提莫” 的英雄。他的攻击可以让敌方英雄艾希(编者注:寒冰射手)进入中毒状态。
当提莫攻击艾希,艾希的中毒状态正好持续 duration 秒。
正式地讲