给定到达火车站的所有列车的到达和离开时间,找出火车站所需的最少站台数,以便列车不等待我们得到了两个数组,表示停站列车的到达和离开时间。
示例:
输入1:
arr[] = {904, 946, 952, 1100, 1508, 1806} dep[] = {915, 1202, 1128, 1135, 1900, 2001}
输出1:3
一次最多有三列火车
(1100到1128之间)
输入2:
arr[] = {2200, 2300} dep[] = {200, 300}
输出2:2
一次最多有两列火车
(2300到200之间)
输入3:
arr[] = {2200, 2300, 0,} dep[] = {300, 300, 300}
输出3:3
一次最多有三列火车
(介于0到300之间)
我可以从GoeksFrEGEKS中找到一个O(nLogn)复杂度的解决方案,我们能用O(n)时间复杂度来解决吗?
列车时刻表的范围固定在0到2399之间,并且列车发车时刻表可以是第二天,这意味着发车时间可以小于到达时间,例如到达2300和离开200。
我们可以假设没有一列火车在站台上停留超过24小时。

最佳答案

由于到达时间和出发时间在1到2400或0到2399之间,所以我们可以使用Redix排序对时间间隔进行排序,只需要四次使用计数排序,所以排序到达和离开的复杂度将是4×N-> O(n)。然后我们可以使用两个排序数组的合并来查找重叠。这将花费n+n->o(n)。
因此,解决该问题的时间复杂度为O(n)。

public class MinimumRequiredPlatform {

public static void main(String args[]){
    Integer[] a1 = {2200, 2300};
    Integer[] b1 = {200, 300};
    int count = findMinRequiredPlatform(a1, b1);
    Assert.isTrue(count == 2, "expected 2 but found " + count);

    Integer a2[] = {904, 946, 952, 1100, 1508, 1806};
    Integer b2[] = {915, 1202, 1128, 1135, 1900, 2001};
    count = findMinRequiredPlatform(a2, b2);
    Assert.isTrue(count == 3, "expected 3 but found " + count);

    Integer[] a3 = {2200, 2300};
    Integer[] b3 = {2300, 300};
    count = findMinRequiredPlatform(a3, b3);
    Assert.isTrue(count == 2, "expected 2 but found " + count);

    Integer[] a4 = {2200, 2300, 0};
    Integer[] b4 = {300, 0, 300};
    count = findMinRequiredPlatform(a4, b4);
    Assert.isTrue(count == 3, "expected 3 but found " + count);
}


/**
 * Time complexity (4*n + 4*n) + (n+n) -> O(n), where n is the number of trains.
 * Space complexity O(n)
 */
private static int findMinRequiredPlatform(Integer[] arr, Integer[] dep) {
    int count = 0;

    int n = arr.length;

    List<Integer> l1 = new ArrayList<>(Arrays.asList(arr));
    List<Integer> l2 = new ArrayList<>(Arrays.asList(dep));

    for(int i = 0; i< n; i++){
        if (dep[i] < arr[i]) {
            l2.set(i, 2399);
            l1.add(0);
            l2.add(dep[i]);
        }
    }

    sort(l1);
    sort(l2);

    n = l1.size();
    int max = 0;
    int i = 0;
    int j = 0;
    while(i < n || j < n) {
        if(i >= n) {
            count--;
            j++;
        }
        else if (i<n && j< n) {
            if (l1.get(i) <= l2.get(j)){
                count++;
                i++;
            } else {
                count--;
                j++;
            }
        }

        if(count > max){
            max = count;
        }
    }

    return max;
}

// Time complexity 4*n -> O(n), space complexity O(n);
private static void sort(List<Integer> a) {
    Map<Integer, List<Integer>> map = new HashMap<>();
    int div = 1;
    int lastDiv;
    int count = 0;
    while(count < 4) {
        lastDiv = div;
        div *= 10;
        for (int i : a) {
            int v = (i % div)/lastDiv;
            if (map.containsKey(v)) {
                map.get(v).add(i);
            } else {
                List<Integer> list = new ArrayList<>();
                list.add(i);
                map.put(v, list);
            }
        }
        int ind = 0;
        for (int i = 0; i < 10; i++) {
            if (map.containsKey(i)) {
                List<Integer> l = map.remove(i);
                for (int v : l) {
                    a.set(ind, v);
                    ind++;
                }
            }
        }
        count++;
    }
}

}

10-02 23:50