目录
补种未成活胡杨
考察移动窗口、双指针、hash
题目描述
近些年来,我国防沙治沙取得显著成果。某沙漠新种植N棵胡杨(编号1-N),排成一排。一个月后,有M棵胡杨未能成活。现可补种胡杨K棵,请问如何补种(只能补种,不能新种),可以得到最多的连续胡杨树?
输入描述
第一行:N总种植数量;
第二行:M未成活胡杨数量;
第三行:M个空格分隔的数,按编号从小到大排列
第四行:K最多可以补种的数量
其中:
1<=N<=100000
1<=M<=N
0<=K<=M
输出描述
最多的连续胡杨棵树
示例1
输入
5
2
2 4
1
输出
3
示例2
输入
13
4
1 4 8 9
1
输出
6
解析
使用双指针指向开头,尾指针向后逐个移动,保证头尾指针之间存在的未种活胡杨树为可补种树,当超过时,头指针向后移动,移动过程中记录窗口的最大长度,直到尾指针移动到最后一个元素结束。
答案
function getContinuousNum(str) {
let [N, M, Marr, K] = str.split('\n')
let hash = {}
Marr.split(' ').forEach(v => {
hash[v] = true
})
let start = 1
let end = 1
let res = 0
let dead = 0
// let live = 0
let len = 0
while (end <= N) {
if (hash[end]) {
dead++
}
len++
// 窗口中死的大于可补种树
while (dead > K && end >= start) {
if (hash[start]) {
dead--
}
start++
len--
}
if (end - start + 1 > res) {
res = end - start + 1
}
end++
}
return res
}
console.log(getContinuousNum(`5
2
2 4
1`))
console.log(getContinuousNum(`13
4
1 4 8 9
1`))
最大N个数与最小N个数的和
考察排