【Lintcode】275. Moving Shed

题目地址:

https://www.lintcode.com/problem/moving-shed/description

给定一个长 n n n的数组 A A A,代表每个车的坐标。给定一个正整数 k k k,题目保证 k ≤ n k\le n kn,要求设计一个长 x x x的车棚,使得这个车棚在最左边和最右边的车之间移动时,任意时刻都能覆盖不少于 k k k辆车。返回最小的满足条件的 x x x

先将 A A A从小到大排好序。如果 k = n k=n k=n,那么 x x x最少取 A [ n − 1 ] − A [ 0 ] + 1 A[n-1]-A[0]+1 A[n1]A[0]+1。否则的话,如果要车棚任何时刻都能覆盖至少 k k k两车,就要 ∀ i , [ i : i + x ] \forall i, [i:i+x] i,[i:i+x]里含 A A A的至少 k k k个数,其实就是在求: max ⁡ i = 0 , . . . , n − 1 − k { A [ i + k ] − A [ i ] } \max_{i=0,...,n-1-k}\{A[i+k]-A[i]\} i=0,...,n1kmax{A[i+k]A[i]}代码如下:

import java.util.Arrays;

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) {
        // write your code here
        Arrays.sort(stops);
    
        int n = stops.length;
        if (n == k) {
            return stops[n - 1] - stops[0] + 1;
        }
        
        int res = 0;
        for (int i = 0; i + k < n; i++) {
            res = Math.max(res, stops[i + k] - stops[i]);
        }
        
        return res;
    }
}

时间复杂度 O ( n log ⁡ n ) O(n\log n) O(nlogn),空间 O ( 1 ) O(1) O(1)

你可能感兴趣的:(LC,数组,链表与模拟,java,算法,数据结构,leetcode)