275. 移动车棚

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);
        }
}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时代我西

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值