吴师兄学算法day06 双指针 485. 最大连续 1 的个数
题目:485. 最大连续 1 的个数
易错点:
- 考察双指的距离
- 注意设置lastzero = -1 虚拟坐标为-1,方便做减法。
- 注意,防止最后的1位越界。对应的处理方案就是每轮结束都有统计结果。
- 其实减法,是左闭右右开的区间,比如,3-2 是1, 写成区间是 [2,3),减法算的是距离
- 而几到几,是左闭右闭的区间, 比如,2到3是 2个数字,写成区间是 [2,3],几到几,统计的人数。学号1-10就是有10个人,但距离是9
代码示例:
class Solution:
def findMaxConsecutiveOnes(self, nums: List[int]) -> int:
# 双指针统计两个指针的距离
lastzero = -1 # 首次是虚拟0,下标为-1 这样就可以直接减法了
ans = 0
for i in range(len(nums)):
if nums[i] == 0: # 如果为0就更新下标
lastzero = i
else: # 为1就更新ans
ans = max(ans,i-lastzero)
return ans
扩展写法:
# 计数器
class Solution:
def findMaxConsecutiveOnes(self, nums: List[int]) -> int:
cnt = 0
max_cnt = 0
for i in nums:
if i == 1: # 每次等于1就开始计数并拿到最大值
cnt +=1
max_cnt = max(max_cnt,cnt)
else: # 否则就重新计数
cnt = 0
return max_cnt
总结:
- 原来减法是左闭右开,为了统计距离
- 几到几是左闭右闭,为了统计人数,
- 双指针的距离,这种,那就用减法。
- 计算的时候,每轮结束就要统计完成,防止最后1位下标越界。
- lastzero是统计距离的外面。直接减法也可以理解为(2,3] 为了把2包括,那么就要(1,3] 这样就包含2,3两个数字了,
- 所以,lastzero就是就设置为外面的。
参考:
https://r07na4yqwor.feishu.cn/docx/SkUidiNifoGlPexrjcncPK2Qnpx