【LeetCode刷题】NO.5

261 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情

1.题目

1094. 拼车 假设你是一位顺风车司机,车上最初有 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

提示:

  • 你可以假设乘客会自觉遵守 “先下后上” 的良好素质
  • trips.length <= 1000
  • trips[i].length == 3
  • 1 <= trips[i][0] <= 100
  • 0 <= trips[i][1] < trips[i][2] <= 1000
  • 1 <= capacity <= 100000

二、思路分析:

这道题我们可以从题目中了解到题目的本质是对数组区间元素的增减操作,所以我们可以利用差分数组的思路进行求解问题,但是本题中的数组的长度没有指出,但是提示中说明了最大值不超过1000,故我们可以创建长度为1001的差分数组,然后需要注意下车点的隐含信息,在end_location处乘客是已经下车不影响上车的乘客,所以我们进行区间的加减操作时,end_location位置的后一位减法需要改成end_location位置与该数组下的乘客数做减法。

三、代码:

/**
 * @param {number[][]} trips
 * @param {number} capacity
 * @return {boolean}
 */
var carPooling = function(trips, capacity) {
    let diff = new Array(1001).fill(0)
    let n = 0
    for(const trip of trips){
        let [num,s,e] = trip
        n = n<e?e:n
        diff[s-1] += num
        diff[e-1] -= num
        if(num > capacity) return false
    }
    
    if(diff[0]>capacity) return false
    for(let i=1 ; i<n ; i++){
        diff[i] += diff[i-1]
        if(diff[i]>capacity) return false
    }
    return true
};

四、总结:

差分数组思想尤其适合解决这些数组区间元素的加减问题,所以以后遇到这些题目我们应该能想到差分数组的思想求解问题并且能够举一反三,希望这篇文章能够对我们都有所帮助0.0