【华为OD机试 Python】滑动窗口问题(一)之补种胡杨树

滑动窗口问题是机试的重点考查内容。合理移动左右指针来控制窗口大小是解决该类问题的核心。其中,最常见的问题是求最长连续子串。


题目描述

近些年来,我国防沙治沙取得显著成果。某沙漠新种植N棵胡杨(编号1-N),排成一排。一个月后,有M棵胡杨未能成活。现可补种胡杨K棵,请问如何补种(只能补种,不能新种),可以得到最多的连续胡杨树?


输入

N 总种植数量 1 <= N <= 100000
M 未成活胡杨数量 1 <= M <= N
M个空格分隔的数,按编号从小到大排列
K最多可以补种的数量 0 <= K <= M

输出

最多的连续胡杨树

示例1

输入

5
2
2 4
1

输出

3

说明

不论补种到2还是4,最长连续胡杨树长度都是3

示例2

输入

10
3
2 4 7
1

输出

6

说明

补种第7棵树时,最长连续胡杨树为5 6 7 8 9 10,长度为6

解题思路及代码

1.题目需要转化为求含有k个0的最长连续子串问题
2.处理输入时,把死树的值设置为0
3.遇到死树k减一,直到k小于0,求当前最长连续树(涉及最…问题一般需要利用动态规划)
4.该问题动态规划递推式 max_l = max (right - left + 1, max_l)

代码如下:

n = int(input())
tree = [1 for _ in range(n + 1)]
m = int(input())
m_l = input().split()
k = int(input())
loc_0 = []
max_l = 0
for i in m_l:
    tree[int(i)] = 0
left = 1
right = 2
while right <= n:
    if tree[left] == 0:
        k = k - 1
        loc_0.append(left)
    if tree[right] == 0:
        k = k - 1
        loc_0.append(right)
    if k == 0:
        max_l = max(right - left + 1, max_l)
    elif k < 0:
        loc = -(k + 1)
        left = loc_0[loc] + 1
        k += 1
    right += 1
print(max_l)

总结

以上就是本文章要讲的内容。我希望这是个大家可以一起讨论学习的地方,我在这里等你。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

从那开始

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值