Постановка задачи. Вы управляете транспортным средством, в котором изначально имеется capacity свободных мест для пассажиров. Транспортное средство только едет на восток (т. е. оно не может развернуться и ехать на запад).

Учитывая список trips, trip[i] = [num_passengers, start_location, end_location] содержит информацию о i-й поездке: количество пассажиров, которых нужно забрать, и места, где их можно забрать и высадить. Местоположения указаны в километрах к востоку от исходного местоположения вашего автомобиля.

Возвращайте true тогда и только тогда, когда можно забрать и высадить всех пассажиров для всех заданных рейсов.

Пример 1:

Input: trips = [[2,1,5],[3,3,7]], capacity = 4
Output: false

Пример 2:

Input: trips = [[2,1,5],[3,3,7]], capacity = 5
Output: true

Пример 3:

Input: trips = [[2,1,5],[3,5,7]], capacity = 3
Output: true

Пример 4:

Input: trips = [[3,2,7],[3,7,9],[8,3,9]], capacity = 11
Output: true

Решение:

Начнем с объяснения поездки, например [3,2,7], означает, что 3 пассажира поедут на станции 2 и высадятся на станции 7.

  1. Из поездок отличное наблюдение, что нельзя было высадить(end_location) раньше start_location. Поэтому нам нужно сортировать поездки по месту начала. Мы будем использовать внешнюю структуру данных для хранения информации о поездке под названием Trip.

2. Второе наблюдение: всякий раз, когда вы приезжаете на станцию, вы должны высадить всех пассажиров на станции и высадить всех пассажиров до этой станции. Почему? Поскольку проверять каждую станцию ​​будет дорого, найдите количество высадившихся пассажиров. Так что лучше заходить в каждую стартовую локацию, всех людей, которые должны выпасть из стартовой локации и до текущей стартовой локации. Мы можем отслеживать количество высаживаемых пассажиров, используя дополнительную структуру данных под названием TreeMap. Причина использования древовидной карты: она поддерживает естественный порядок высадки пассажиров на каждой станции.

TreeMap<end_location,number_of_passengers_to_dropped_of> downPassengers;

3. Третье замечание, вместимость увеличится для высадки и уменьшится для посадки пассажиров.

Решение Java:

public class CarPooling {
    CarPooling carPooling;
    static int mCapacity;

    class Trip {
        int passengers;
        int start_loc;
        int end_location;

        public Trip(int passengers, int start_loc, int end_location) {
            this.passengers = passengers;
            this.start_loc = start_loc;
            this.end_location = end_location;
        }

        public int getPassangers() {
            return passengers;
        }

        public int getStart_loc() {
            return start_loc;
        }

        public int getEnd_location() {
            return end_location;
        }
    }

    @BeforeEach
    public void init() {
        carPooling = new CarPooling();
    }

    @Test
    public void firstTest() {
        boolean isPossible = carPooling.carPooling(new int[][]{{3, 2, 7},
                {3, 7, 9}, {8, 3, 9}}, 11);
        Assertions.assertEquals(true, isPossible);
    }

    @Test
    public void secondTest() {
        boolean isPossible = carPooling.carPooling(new int[][]{{2, 1, 5},
                {3, 3, 7}}, 5);
        Assertions.assertEquals(true, isPossible);
    }

    @Test
    public void thirdTest() {
        boolean isPossible = carPooling.carPooling(new int[][]{{2, 1, 5},
                {3, 3, 7}}, 4);
        Assertions.assertEquals(false, isPossible);
    }

    @Test
    public void fourthTest() {
        boolean isPossible = carPooling.carPooling(new int[][]{{2, 1, 5},
                {3, 5, 7}}, 3);
        Assertions.assertEquals(true, isPossible);
    }

    @Test
    public void fifthTest() {
        boolean isPossible = carPooling.carPooling(new int[][]{{3, 2, 8},
                {4, 4, 6}, {10, 8, 9}}, 11);
        Assertions.assertEquals(true, isPossible);
    }

    @Test
    public void sixthTest() {
        boolean isPossible = carPooling.carPooling(new int[][]{{4, 3, 4},
                {3, 2, 4}, {1, 8, 9}, {7, 2, 5}}, 14);
        Assertions.assertEquals(true, isPossible);
    }

    public boolean carPooling(int[][] trips, int capacity) {
        mCapacity = capacity;
        // Sort the trip based on start location
        ArrayList<Trip> tripList = new ArrayList<>();
        for (int i = 0; i < trips.length; i++) {
            int[] t = trips[i];
            tripList.add(new Trip(t[0], t[1], t[2]));
        }

        Collections.sort(tripList, (t1, t2) -> {
            if (t1.start_loc > t2.start_loc) return 1;
            else if (t1.start_loc < t2.start_loc) return -1;
            else return 0;
        });

        // monitor, how many people will be dropped in what location
        TreeMap<Integer, Integer> downPassengers = new TreeMap<>();
        for (int i = 0; i < trips.length; i++) {
            Trip trip = tripList.get(i);
            // whenever a new station comes, you already dropped all the passenger before this location
            dropAllPassengerBefore(trip.getStart_loc(), downPassengers);
            if (trip.getPassangers() > mCapacity)
                return false;
            else {
                downPassengers.compute(trip.getEnd_location(),
                        (k, v) -> v == null ? trip.getPassangers() : v + trip.getPassangers());
                mCapacity -= trip.getPassangers();
            }
        }
        return true;

    }

    private void dropAllPassengerBefore(int start_loc,
                                        TreeMap<Integer, Integer> downPassengers) {
        Iterator<Map.Entry<Integer, Integer>> it = downPassengers.entrySet().iterator();
        while (it.hasNext()) {
            Map.Entry<Integer, Integer> entry = it.next();
            if (entry.getKey() <= start_loc) {
                mCapacity += entry.getValue();
                it.remove();

            } else {
                break;
            }
        }

    }
}

Вот код в github.