LeetCode 1094. 拼车

99 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第28天,点击查看活动详情

一、题目描述:

1094. 拼车 - 力扣(LeetCode)

车上最初有 capacity 个空座位。车 只能 向一个方向行驶(也就是说,不允许掉头或改变方向

给定整数 capacity 和一个数组 trips ,  trip[i] = [numPassengersi, fromi, toi] 表示第 i 次旅行有 numPassengersi 乘客,接他们和放他们的位置分别是 fromi 和 toi 。这些位置是从汽车的初始位置向东的公里数。

当且仅当你可以在所有给定的行程中接送所有乘客时,返回 true,否则请返回 false

 

示例 1:

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

示例 2:

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

 

提示:

  • 1 <= trips.length <= 1000
  • trips[i].length == 3
  • 1 <= numPassengersi <= 100
  • 0 <= fromi < toi <= 1000
  • 1 <= capacity <= 10^5

二、思路分析:

  1. 提议可以判断出来:如要对区间频繁操作。区间的频繁操作考虑使用差分法
  2. 需要求出某个区间的乘客的数量: 定义一个差分数组。diff[区间start] +=乘客数量,diff[区间end] -=乘客数量。 遍历所有二维数组,那么可以求出差分数组
  3. 对差分数组进行遍历,求前缀和,然后判断每一个前缀和的值,如果大于设定的Capacity 返回false.否则返回true.
  4. 可以把二维数组的反复求和转化为o(n)复杂度算法。提高计算效率 需要注意的点: 1:差分数组的定义以及边界的定义
  5. 前缀和数组的求和,以及比较要从0位开始比较。preSum[i-1]

三、AC 代码:

#define MAXNUM 1001
bool carPooling(int** trips, int tripsSize, int* tripsColSize, int capacity){
//区间操作:1,5 上两个乘客 +2;3,7上3个乘客,+3,如果任何一个区间的乘客数量大于Capacity 说明无法承接现有的乘客,return false
    // define Diff array
    int* diff = (int*)calloc(MAXNUM,sizeof(int));
    for(int i = 0;i<tripsSize;i++){
        diff[trips[i][1]] += trips[i][0];
        diff[trips[i][2]] -= trips[i][0]; 
    }
    int* preSum = (int*)calloc(MAXNUM +1,sizeof(int));
    preSum[0] = diff[0];
    for(int i = 1;i < MAXNUM;i++){
        preSum[i] = preSum[i - 1] + diff[i];
        if(preSum[i-1] > capacity) return false;    
    }
    return true;
}