拼车

拼车----模拟的方法

假设你是一位顺风车司机,车上最初有 capacity 个空座位可以用来载客。由于道路的限制,车 只能 向一个方向行驶(也就是说,不允许掉头或改变方向,你可以将其想象为一个向量)。

这儿有一份乘客行程计划表 trips[][],其中 trips[i] = [num_passengers, start_location, end_location] 包含了第 i 组乘客的行程信息:

必须接送的乘客数量;
乘客的上车地点;
以及乘客的下车地点。
这些给出的地点位置是从你的 初始 出发位置向前行驶到这些地点所需的距离(它们一定在你的行驶方向上)。

请你根据给出的行程计划表和车子的座位数,来判断你的车是否可以顺利完成接送所有乘客的任务(当且仅当你可以在所有给定的行程中接送所有乘客时,返回 true,否则请返回 false)。

示例 1:

输入:trips = [[2,1,5],[3,3,7]], capacity = 4
输出:false
示例 2:

输入:trips = [[2,1,5],[3,3,7]], capacity = 5
输出:true
示例 3:

输入:trips = [[2,1,5],[3,5,7]], capacity = 3
输出:true
示例 4:

输入:trips = [[3,2,7],[3,7,9],[8,3,9]], capacity = 11
输出:true

思路:因为车只能往前走,不能掉头;所以我们以这条线进行一个for循环,循环每个地点,看看座位数是否满足上车下车。
第一步,先找出下车地点的最大值,也就是车上的人全部下完的地点。
for(int i=0;i<trips.length;i++){
if(max<trips[i][2]){
max=trips[i][2];
}
}
第二步,因为每个地点都可能有上车的人和下车的人,下车,则车里的人数减少;上车,车里的人数增加。
计算上下车人数;
int start=new int[max+1];
int end=new int[max+1];
for(int i=0;i<trips.length;i++){
start[trips[i][1]]+=trips[i][0];
end[trips[i][2]]+=trips[i][0];

}
第三步,因为车只跑一趟,我们必须保证该地点所有人上车,而且上车以后有座位坐,否则直接返回false。也就是说,我们可以模拟上下车,记录车里的人数。如果某个地点,人上车后,车里的座位数不够,那么返回false.
int count=0;//记录车里的人数
for(int i=0;i<max;i++){
count-=end[i];//end[i]是指下车人数
count+=start[i];start[i]是指上车人数
if(count<capacity){
return false;
}
return true;
完整代码:
'''

    class Solution {
  public boolean carPooling(int[][] trips, int capacity) {
    if(trips.length == 0){
        return true;
    }
    //找出最大值(最后一个下车的地点)
    int max=0;
    for(int i=0;i<trips.length;i++){
        if(max<trips[i][2]){
            max=trips[i][2];
        }
    }
    int[] start = new int[max + 1];//记录哪个点有多少人上车
    int[] end = new int[max + 1];//记录哪个点有多少人下车
    for(int i = 0; i < trips.length; i++){
        
        start[trips[i][1]] += trips[i][0];
        end[trips[i][2]] += trips[i][0];
    }
    //模拟上下车
    int count = 0;//车里的人数
    for(int i = 0; i < max; i++){
        count -= end[i];
        count += start[i];
        if(count > capacity){
            return false;
        }
    }
    return true;
}
}
posted @ 2021-03-28 16:03  heyhy  Views(70)  Comments(0Edit  收藏  举报