「这是我参与11月更文挑战的第27天,活动详情查看:2021最后一次更文挑战」
说明:文章部分内容及图片出自网络,如有侵权请与我本人联系(主页有公众号:小攻城狮学前端)
作者:小只前端攻城狮、 主页:小只前端攻城狮的主页、 来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
题意描述
假设你是一位顺风车司机,车上最初有 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
解法1:差分数组+Map
思路:差分数组,我们都知道也就是前缀和的变式,我们把在不同站点的上下车看作是对差分数组不同区间内的数的加减操作。最后计算每一个站点的人数,如果人数超标就返回 false,并且因为只需要进行判断,所以人数可以不用数组来存。空间复杂度也节省了。
var carPooling = function(trips, capacity) {
const map = {};
for (const trip of trips) {
const [ passengers, start, end ] = trip;
for (let index = start; index < end; index++) {
map[index] = map[index] ? map[index] + passengers : passengers;
if (map[index] > capacity) {
return false;
}
}
}
return true;
};
解法2:贪心
思路:我们首先对数组进行排序,排序由起始位置trips[i][1]升序排列,遍历数组,每当到达某个人的上车点的时候就判断位置够不够,维护一个result变量。
var carPooling = function(trips, capacity) {
trips.sort((a,b)=>a[1]-b[1])
let num=0,result=true
let Cars={}
for(i=0;i<trips.length;i++){
for(key in Cars){
if(key<=trips[i][1]){
num-= Cars[key]
delete Cars[key]
}
}
num+=trips[i][0]
Cars[trips[i][2]]= Cars[trips[i][2]]? Cars[trips[i][2]]+=trips[i][0]:trips[i][0]
if(num>capacity){
result=false
break
}
}
return result
};
感谢阅读,希望能对你有所帮助,文章若有错误或者侵权,可以在评论区留言或在我的主页添加公众号联系我。
写作不易,如果觉得不错,可以「点赞」+「评论」 谢谢支持❤