抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

当题目给出的数据不是很大,需要快速求解数组区间的和,并且频繁的对数组内的值增加和减掉,可以考虑用差分数组来实现快速求区间值。

1094.拼车

Problem: 1094. 拼车

车上最初有 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 <= 105
  1. 思路

    题目给出的数据不是很大,然后需要频繁对车站人数上车和下车,即频繁的增加和减掉,可以考虑用差分数组来实现。

  2. 解题方法

    差分数组,题目给出车站从0-1000,那么只需计算经过每个站车上的人数,不需要管需不需要下车, 求出每个站在车上的人数,然后再循环比对每个车站的人数,如果超过限制人数,直接返回false。

  3. 复杂度

    • 时间复杂度:

      $O(n)$

    • 空间复杂度:

$O(n)$

  1. Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class Solution {
public boolean carPooling(int[][] trips, int capacity) {
// 差分数组,题目给出车站从0-1000,那么只需计算经过每个站车上的人数,不需要管需不需要下车
int[] nums = new int[1001];
for (int[] trip: trips) {
int p = trip[0];
int from = trip[1];
int to = trip[2] - 1; // 比如第0站坐到第2个站,那么还在车上为0,1
// 给 from 到 to - 1 的都加 p
nums[from] += p;
if (to + 1 < 1001) {
nums[to + 1] -= p;
}
}
// 将差分数组转化为原数据
int[] res = new int[1001];
res[0] = nums[0];
for (int j = 1; j < 1001; j++) {
res[j] = res[j - 1] + nums[j];
}
// 然后判断每个站的车上人数是否超载
for (int k = 0; k < 1001; k++) {
if (res[k] > capacity) return false;
}
return true;
}
}

评论