题目
https://www.lintcode.com/problem/275
有一些车辆在停放中。给定一个整数数组stops,代表每辆车停车的位置。给定一个整数k,现在你要建造一个移动车棚。需要车棚在这些车辆之间移动时(车棚的最前端不超过最前面的车,车棚的最后端不超过最后面的车),移动车棚在任意的位置均能成功覆盖到k辆车。请求出能满足要求的最短车棚的长度。
stops的长度:[2,1000]。
stops中的元素大小:[1,10000]。
2 ≤ k ≤ stops的长度。
保证stops中的元素不会重复。
样例
样例 1:
输入:stops=[7,3,6,1,8], k=3
输出:6
解释:这5辆车分别在1,3,6,7,8位置。车棚需要至少覆盖到3辆车,长度最少为6,因为它建在[1,6],[2,7],[3,8]均能覆盖到3辆及以上车辆。若长度为5,则建在[1,5]和[2,6]时只覆盖到2辆车,不满足条件。
样例 2:
输入:stops=[7,3,6,1,8], k=2
输出:5
解释:这5辆车分别在1,3,6,7,8位置。车棚需要至少覆盖到2辆车,长度最少为5,因为它建在[1,5],[2,6],[3,7],[4,8]均能覆盖到2辆及以上车辆。若长度为4,则建在[2,5]时只覆盖到1辆车,不满足条件。
思路
这题目容易理解错 要的是每一个k个滑动窗口里都要满足条件
要找k+1个的窗口,k+1 exclusive (除了最后一个窗口 直接end - left + 1)
要永远都能覆盖到k辆车,那就是需要至少k个间隔,也就是第i辆车到第i+k辆车的间隔
答案
public class Solution {
/**
* @param stops: An array represents where each car stops.
* @param k: The number of cars should be covered.
* @return: return the minimum length of the shed that meets the requirements.
*/
public int calculate(int[] stops, int k) {
/*
来自题目:【275.移动车棚】的笔记
这题目容易理解错 要的是每一个k个滑动窗口里都要满足条件
要找k+1个的窗口,k+1 exclusive (除了最后一个窗口 直接end - left + 1)
要永远都能覆盖到k辆车,那就是需要至少k个间隔,也就是第i辆车到第i+k辆车的间隔
*/
Arrays.sort(stops);
int max = Integer.MIN_VALUE,n= stops.length;
if(n<=k){
return stops[n-1]-stops[0]+1;
}
for (int i = k; i <n ; i++) {
max = Math.max(max,stops[i]-stops[i-k]);
}
return max;
}
}