题目:
给定一个二进制数组
nums,如果最多可以翻转一个0,则返回数组中连续1的最大个数。
JAVA
方法一:
将每个存放0的索引通过list存储起来,然后遍历list,计算list.get(i) - list.get(i - 2)的最大值。代码较简洁,但时间和内存消耗较大。
class Solution {
public int findMaxConsecutiveOnes(int[] nums) {
List<Integer> list = new ArrayList<>();
for (int i = 0; i < nums.length; i++){
if(nums[i] == 0){
list.add(i);
}
}
int max = 0;
if(list.size() < 2) return nums.length;
list.add(nums.length);
for (int i = 1; i < list.size(); i++){
if(i > 1){
max = Math.max(list.get(i) - list.get(i - 2) - 1, max);
} else {
max = Math.max(list.get(i), 0);
}
}
return max;
}
}
方法二:
设置多个变量来存储中间值,max最大值,middle存储相邻两个0之间的1的数量(需要减一,5和1之间有三个值),flag存储上一个0的位置便于计算当前middle,处理特殊情况,数组末尾不为0,默认数组长度的索引的值为0。代码较复杂,但时间和内存消耗较小。
class Solution {
public int findMaxConsecutiveOnes(int[] nums) {
int max = 1;
int middle = 0;
int flag = 0;
int count = 0;
for (int i = 0; i < nums.length; i++){
if(nums[i] == 0){
if(flag != 0){
max = Math.max(max, i - flag + middle);
//类似5-1 = 4,但是中间个数为3
middle = i - flag - 1;
} else {
middle = i;
}
flag = i;
count++;
}
}
if(count <= 1) max = nums.length;
if(flag != nums.length - 1){
return Math.max(max, nums.length - flag + middle);
}
return max;
}
}


被折叠的 条评论
为什么被折叠?



