吴师兄学算法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

posted @ 2024-01-14 11:49  o蹲蹲o  阅读(3)  评论(0编辑  收藏  举报