lintcode 275 · モバイルカーポート [中VIPスライディングウィンドウ]

トピック

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;
    }
}

おすすめ

転載: blog.csdn.net/weixin_37991016/article/details/132840436
おすすめ