You are driving a vehicle that has capacity
empty seats initially available for passengers. The vehicle only drives east (ie. it cannot turn around and drive west.)
Given a list of trips
, trip[i] = [num_passengers, start_location, end_location]
contains information about the i
-th trip: the number of passengers that must be picked up, and the locations to pick them up and drop them off. The locations are given as the number of kilometers due east from your vehicle's initial location.
Return true
if and only if it is possible to pick up and drop off all passengers for all the given trips.
Example 1:
Input: trips = [[2,1,5],[3,3,7]], capacity = 4
Output: false
Example 2:
Input: trips = [[2,1,5],[3,3,7]], capacity = 5
Output: true
Example 3:
Input: trips = [[2,1,5],[3,5,7]], capacity = 3
Output: true
Example 4:
Input: trips = [[3,2,7],[3,7,9],[8,3,9]], capacity = 11
Output: true
Constraints:
trips.length <= 1000
trips[i].length == 3
1 <= trips[i][0] <= 100
0 <= trips[i][1] < trips[i][2] <= 1000
1 <= capacity <= 100000
這道題說的是拼車的那些事兒,給了一個數組,里面是很多三元對兒,分別包含乘客個數,上車時間和下車時間,還給了一個變量 capacity,說是任何時候的乘客總數不超過 capacity 的話,返回 true,否則就返回 false。這道題其實跟之前的 Meeting Rooms II 是一樣,只不過那道題是求需要的房間的總個數,而這里是限定了乘客的總數,問是否會超載。使用的解題思想都是一樣的,主要是需要將上車時間點和下車時間點拆分開,然后按時間順序排列在同一條時間軸上,上車的時候就加上這些人數,下車的時候就減去這些人數。若某個時間點上的總人數超過了限定值,就直接返回 false 就行了,這里博主沒有用 TreeMap,而是直接都放到一個數組中,然后對該數組按時間點進行排序,再遍歷排序后的數組,進行累加元素之和即可,參見代碼如下:
解法一:
class Solution {
public:
bool carPooling(vector<vector<int>>& trips, int capacity) {
int cur = 0;
vector<vector<int>> data;
for (auto trip : trips) {
data.push_back({trip[1], trip[0]});
data.push_back({trip[2], -trip[0]});
}
sort(data.begin(), data.end());
for (auto &a : data) {
cur += a[1];
if (cur > capacity) return false;
}
return true;
}
};
接下來看一種更加高效的解法,並不用進行排序,那個太耗時了。題目限定了時間點不會超過 1000,所以這里就建立一個大小為 1001 的 cnt 數組,然后遍歷 trips 數組,將對應的上車時間點加上乘客人數,下車時間點減去乘客人數,這樣的話就相當於排序完成了,有點計數排序的感覺。之后再遍歷這個 cnt 數組,累加當前的值,只要超過 capacity 了,就返回 false,否則最終返回 true 即可,參見代碼如下:
解法二:
class Solution {
public:
bool carPooling(vector<vector<int>>& trips, int capacity) {
int cur = 0;
vector<int> cnt(1001);
for (auto &trip : trips) {
cnt[trip[1]] += trip[0];
cnt[trip[2]] -= trip[0];
}
for (int i = 1; i <= 1000; ++i) {
cur += cnt[i];
if (cur > capacity) return false;
}
return true;
}
};
Github 同步地址:
https://github.com/grandyang/leetcode/issues/1094
類似題目:
參考資料:
https://leetcode.com/problems/car-pooling/
https://leetcode.com/problems/car-pooling/discuss/317610/JavaC%2B%2BPython-Meeting-Rooms-III
https://leetcode.com/problems/car-pooling/discuss/317611/C%2B%2BJava-O(n)-Thousand-and-One-Stops