题解 | 小红的01子序列构造(easy)

小红的01子序列构造(easy)

https://www.nowcoder.com/practice/ee0b6c6baa2642c182df8b4390126f9a

from collections import defaultdict

# 双指针 滑动窗口 哈希
n, k = map(int, input().split())
s = input()
left = 0
cur_01 = 0  # 代表当前01子串个数
cache = defaultdict(int)
for i, c in enumerate(s):
    if c == '1':
        cache[1] += 1
        cur_01 += cache[0]  # 此前有多少0,就增加多少01子串
        if cur_01 == k:
            print(left + 1, i + 1)
            break
        while cur_01 > k:  # 加上当前元素后,01子串个数超出要求,移动左指针,减小窗口
            if s[left] == '0':
                cur_01 -= cache[1]  # 0脱离窗口,此后有多少1,就减少多少01子串
                cache[0] -= 1  # 更新cache
            else:
                cache[1] -= 1  # 左1离开窗口,不影响01子串个数
            left += 1
        if cur_01 == k:  # 左指针移动结束,检查是否刚好达到目标
            print(left + 1, i + 1)
            break
    else:
        cache[0] += 1
if cur_01 != k:  # 没找到,输出-1
    print(-1)

使用滑动窗口做法,right指针就是for循环中的i,增加right,直到窗口中01子串超出个数就移动left。如果窗口中个数符合要求,则打印此时的left,right,退出循环。

全部评论

相关推荐

不愿透露姓名的神秘牛友
07-07 14:00
不想多说了,什么逆天HR,还要教我礼貌😂
机械打工仔:这不纯傻卵吗,他还操心上别人老板了
投递BOSS直聘等公司7个岗位
点赞 评论 收藏
分享
码农索隆:有点耳熟,你们是我教过最差的一届
点赞 评论 收藏
分享
湫湫湫不会java:先投着吧,大概率找不到实习,没实习的时候再加个项目,然后把个人评价和荣誉奖项删了,赶紧成为八股战神吧,没实习没学历,秋招机会估计不多,把握机会。或者说秋招时间去冲实习,春招冲offer,但是压力会比较大
点赞 评论 收藏
分享
06-19 19:06
门头沟学院 Java
码农索隆:别去东软,真学不到东西,真事
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-07 18:05
哈哈哈哈哈感觉朋友找工作的已经疯掉了,直接上图
码农索隆:真老板娘:“我嘞个去,这不我当年的套路吗
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务