【补种未成活胡杨】
近些年来,我国防沙治沙取得显著成果。某沙漠新种植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或4结果一样,最多的连续胡杨棵树都是3。
题目分析:
当我们遇到数组或字符串、连续, 需要输出或比较的结果在原数据结构中是连续排列的(字符串中的连续不重复子串,数组中的连续元素最大和)就应该去想到滑动窗口算法,对“连续”、“最长”、“最短”、“子串,子序列”等要有滑动窗口算法的敏感性,需要注意的是,滑动窗口算法更多的是一种思想,而非某种数据结构的使用。
滑动窗口算法个人理解
滑动窗口算法就是定义两个初始指针,left、right。right向边界移动与left形成一个窗口,通过right与left的轮流前进,窗口大小增增减减,向右滑行的过程中,记录在滑动过程中很多的【可行解】,并在【可行解】中找到【最优解】。
滑动窗口算法在本题的应用图解
Java实现
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();//总种植数量
int M = sc.nextInt();//未成活胡杨数量
sc.nextLine();//解决nextInt后nextLine接收\n直接跳过的问题
String die_indexs_str = sc.nextLine();
String[] die_indexsArr = die_indexs_str