滑动窗口问题是机试的重点考查内容。合理移动左右指针来控制窗口大小是解决该类问题的核心。其中,最常见的问题是求最长连续子串。
题目描述
近些年来,我国防沙治沙取得显著成果。某沙漠新种植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)
总结
以上就是本文章要讲的内容。我希望这是个大家可以一起讨论学习的地方,我在这里等你。