解决之路= =
题目描述
测试案例(部分)
第一次
双指针来试试,初始left
是0
,从数组头开始,right
初始是left+1
也就是1
。只要right
不越界,循环就一直进行。然后每轮循环检查left
和right
两个位置的元素是否相等,相等就right+1
继续检查,不相等就调整left
和right
的位置。
class Solution(object):
def findMaxConsecutiveOnes(self, nums):
n = len(nums)
left = 0
right = 1
len_list = []
while right < n:
if nums[left] == nums[right]:
right += 1
else:
len_list.append(right - left)
left = right
right = left + 1
return max(len_list)
测试错误。
第二次
简单盘一下逻辑代码,感觉是越界问题没有处理好。
比如第一个测试列表一样,结尾的三个1为什么检查不出来?就是因为位置为3的和位置为5的元素相同,触发right+1
,然后不满足while循环条件,直接结束了,没有将本次检查的结果加到len_list
中。
class Solution(object):
def findMaxConsecutiveOnes(self, nums):
n = len(nums)
left = 0
right = 1
len_list = []
while right < n:
if nums[left] == nums[right]:
right += 1
# 加上一个判断,处理越界问题
if right == n:
len_list.append(right - left)
break
else:
len_list.append(right - left)
left = right
right = left + 1
return max(len_list)
测试正确,提交!报错了。
第三次
再加个判断避免一下这个极端情况。然后发现继续报错。输入[1]返回1,输入[0]返回0。很疑惑,加上两个判断之后,还是报错。
class Solution(object):
def findMaxConsecutiveOnes(self, nums):
if nums == [1]:
return 1
if nums == [0]:
return 0
n = len(nums)
left = 0
right = 1
len_list = []
while right < n:
if nums[left] == nums[right]:
right += 1
if right == n:
len_list.append(right - left)
break
else:
len_list.append(right - left)
left = right
right = left + 1
return max(len_list)
发现题目意思理解有问题。。。。题目说数组是一个存二进制的数组,只有0和1,0表示没有数据,判断连续只是对于1来说的。
只能说,是审题没审好= =。重新看看思路吧。
第四次
中途被叫去喝了顿酒= =,回来接着写。在路上自己想到可以这么改,我们看完代码再来解释思路。
class Solution(object):
def findMaxConsecutiveOnes(self, nums):
count = 0
res = []
for v in nums:
if v != 1:
res.append(count)
count = 0
else:
count += 1
res.append(count)
return max(res)
这个代码的思路个人觉得比较巧妙,一个循环O(n)实现。
设置一个计数器和一个空列表,空列表存放每次清零之前的计数情况。
思路就是遇到0就清零。
然后最后返回列表中的最大值。即可完成需求。
最后循环之外又加了一句
res.append(count)
是为了解决第一次中的越界问题,大家盘一盘思路就可以理解了。
测试正确,提交成功!打败了70%多用户,40ms,及格了!