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 <= 105
class Solution {
int[] nums = new int[1001];
public boolean carPooling(int[][] trips, int capacity) {
int[] dif = new int[1001];
int len = trips.length;
for(int i = 0 ;i < len ; i++) {
int num = trips[i][0];
dif[trips[i][1]] += num;
dif[trips[i][2]] -= num;
}
nums[0] = dif[0];
if(nums[0] > capacity) return false;
for(int i = 1 ; i < 1001;++i) {
nums[i] = nums[i-1]+dif[i];
if(nums[i] > capacity) return false;
}
return true;
}
}
每日一题,今天是中等题。算法有关差分数组。
读题。可以发现题目虽然进行了包装,但本质上还是对一个路程数组里的元素进行加减的操作,同时判断操作完之后,元素值是否会出现违规的状态(超过该车的容量capacity)。所以本质上还是差分数组的题目,但题目没有给每次具体的值,但我们观察所给条件,可以发现from和to最多也就1000,我们只需要开一个1001的数组就可以满足条件了。开一个长度1001的dif数组和nums数组,nums数组用来作为最后算实际人数的数组,dif就是差分数组了,一开始没人,所以dif整个数组都是0,之后根据每次旅游进行区间人数的加减。最后根据差分数组倒推的公式,就可以算出nums的实际数值,并且对这些数值进行判断,是否会超过capacity。不会的话就满足条件,超过的话就没法送完。但要注意对nums[0]也需要进行一次判断。之后就可以返回答案了。
差分数组等数组类算法,后续会整理到零基础算法中,敬请期待。运行后的结果如下: