返回

LeetCode-1094:利用差分数组解决拼车问题

前端

在 LeetCode 的第 1094 题“拼车”中,我们遇到一个有趣的场景:一群乘客希望拼车出行,而我们的任务是计算他们需要支付的最少费用。为了解决这个问题,我们可以利用一种巧妙的算法——差分数组。

差分数组:操作区间的利器

差分数组是一种神奇的工具,它允许我们在数据数组的特定区间内进行各种操作,而无需直接修改原始数组。它的工作原理如下:

  • 创建一个与原始数组大小相同的差分数组。
  • 差分数组中每个元素表示其在原始数组中对应索引的值与前一个元素的差值。

通过这种方式,我们可以对差分数组的特定区间执行以下操作:

  • 增加或减少: 在区间的起点增加或减少一个值,在区间的终点减去或增加相同的值。
  • 求和: 区间的起点和终点的差值就是原始数组中该区间元素的总和。

利用差分数组解决拼车问题

回到 LeetCode-1094,我们可以将乘客的出发地和目的地视为原始数组中的索引,将费用视为每个元素的值。

  1. 建立差分数组: 创建一个与乘客数量相匹配的差分数组,并在每个乘客的出发地索引处增加费用,在目的地索引处减去费用。

  2. 计算最小费用: 对于每个可能的集合点,我们都可以在差分数组中求出出发地到集合点的总和。集合点处费用最小的点就是我们需要的集合点。

代码实现(JavaScript)

/**
 * @param {number[][]} trips
 * @return {number}
 */
const carPooling = (trips) => {
  // 创建差分数组
  const diff = new Array(1001).fill(0);

  // 更新差分数组
  for (const trip of trips) {
    diff[trip[1]] += trip[0];
    diff[trip[2]] -= trip[0];
  }

  // 计算最小费用
  let min = diff[0], passengers = 0;
  for (let i = 1; i < diff.length; i++) {
    passengers += diff[i];
    if (passengers > min) {
      min = passengers;
    }
  }

  return min;
};

结论

利用差分数组,我们可以高效地解决 LeetCode-1094 中的拼车问题。通过巧妙地将操作应用于差分数组,我们可以快速计算每个集合点的费用,并找出费用最小的集合点。