275. 移动车棚
有一些车辆在停放中。给定一个整数数组
stops
,代表每辆车停车的位置。给定一个整数
k
,现在你要建造一个移动车棚。需要车棚在这些车辆之间移动时(车棚的最前端不超过最前面的车,车棚的最后端不超过最后面的车),均能成功覆盖到
k
辆车。请求出能满足要求的最短车棚的长度。
样例
样例 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辆车,不满足条件。
注意事项
stops
的长度:[2,1000]。
stops
中的元素大小:[1,10000]。
2 ≤
k
≤
stops
的长度。
保证
stops
中的元素不会重复。
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) {
sortList(stops, 0, stops.length - 1);
int max =k;
for (int i = k; i < stops.length; i++) {
max=Math.max(max,stops[i]-stops[i-k]);
}
return max;
}
private void sortList(int[] arr, int low, int high) {
if (high <= low) {
return;
}
int start = low;
int end = high;
int midValue = arr[low];
boolean flag = true;
while (true) {
if (flag) {
if (arr[high] > midValue) {
high--;
} else if (arr[high] < midValue) {
arr[low] = arr[high];
low++;
flag = false;
}
} else {
if (arr[low] < midValue) {
low++;
} else if (arr[low] > midValue) {
arr[high] = arr[low];
high--;
flag = true;
}
}
if (low == high) {
arr[low] = midValue;
break;
}
}
sortList(arr, start, low - 1);
sortList(arr, low + 1, end);
}
}