1094. 拼车 --力扣 --JAVA
题目
车上最初有
capacity
个空座位。车 只能 向一个方向行驶(也就是说,不允许掉头或改变方向)给定整数
capacity
和一个数组trips
,trip[i] = [numPassengersi, fromi, toi]
表示第i
次旅行有numPassengersi
乘客,接他们和放他们的位置分别是fromi
和toi
。这些位置是从汽车的初始位置向东的公里数。当且仅当你可以在所有给定的行程中接送所有乘客时,返回
true
,否则请返回false
。
解题思路
- 车不允许掉头和改变方向,所以需要重最近位置开始接客;
- 根据上车位置对乘客进行排序;
- 遍历排序后的数组,通过map存储当前车上的乘客下车位置和人数;
- 通过list记录哪些位置有乘客下车,并在之后从map中删除该数据;
- 根据上下车乘客对座位进行加减,当座位小于0时则失败;
代码展示
class Solution {
public boolean carPooling(int[][] trips, int capacity) {
//根据起始位置对数组进行排序
Arrays.sort(trips, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return o1[1] - o2[1];
}
});
//记录在哪个位置下去多少人
Map<Integer,Integer> store = new HashMap<>();
for (int i = 0; i < trips.length; i++){
//存储已经下车的
List<Integer> data = new ArrayList<>();
for (Integer num : store.keySet()){
if (trips[i][1] >= num){
//释放空座位,清除已下车的人
capacity += store.get(num);
data.add(num);
}
}
for (Integer num : data){
store.remove(num);
}
capacity -= trips[i][0];
store.put(trips[i][2], store.getOrDefault(trips[i][2], 0) + trips[i][0]);
if(capacity < 0){
return false;
}
}
return true;
}
}