1.原题
给定一个二进制数组(由0和1组成),求其中最大连续1的个数。
示例:
输入:[1,1,0,1,1,1]
输出:3
解释:开头两位和最后三位都是连续的1,所以最大连续1的个数是3
2.我的第一遍的解法
class Solution {
public int findMaxConsecutiveOnes(int[] nums) {
int max = 0, count = 0;
//1.遍历数组
for (int num : nums) {
//2.元素是1 计数
// 元素是0 与当前最大连续1比较
if (num == 1) ++count;
else {
//3.如果1的个数已经大于数组的一半 直接return
if(count>=nums.length/2) return count;
if (count > max)
max = count;
count = 0;
}
}
return Math.max(max, count);
}
}
其中第3步并没有起到优化的效果:加第三步之前运行time是1ms,加上之后是2ms。原因我猜测是count>=nums.length/2
这个条件太苛刻了,可以说90%的测试用例都不符合这个条件,加上这句反而使得90%的测试用例都要多执行一次判断,运行效率自然就低了不少。
3.网上好的解法
遇1加1,遇0清0!!!
我愿称之为最简代码!!!
class Solution {
public static int findMaxConsecutiveOnes(int[] nums) {
int cur = 0, max = 0;
for (int num : nums) {
if ((cur = ++cur * num) > max) {
max = cur;
}
}
return max;
}
}
时间复杂度为O(n)的双指针法!大赞!
public static int findMaxConsecutiveOnes(int[] nums) {
//双指针法
int n = nums.length, res = 0;
for (int i = 0; i < n; i++) {
int j = i;
while (j < n && nums[j] == 1) j++;
res = Math.max(res, j - i);
i = j;
}
return res;
}
稍微有点慢的双指针法
public static int findMaxConsecutiveOnes(int[] nums) {
//双指针法
int r=0,l=0,res=0;
while (r<nums.length){
if(nums[r++]==1){
//r-l:r是连续的1的右边界,l是左边界,左闭右开,所以连续的1的长度是r-l;
res=Math.max(res,r-l);
}else {
r=l;
}
}
return res;
}
4.自己可以改进的地方
时间复杂度上没有什么可以改进的地方,自己的解题思路还是有点少
,像上面的最简代码和双指针法都是值得学习的。所以还需要多刷题!
5.精简自己的代码
感觉没啥可以精简的了…
6.思考
- 像遍历数组的题感觉使用双指针法也不戳!
- 多刷题!
- 冲!!!