LeetCode解题分享:1094. Car Pooling

Problem

You are driving a vehicle that has capacity empty seats initially available for passengers. The vehicle only drives east (ie. it cannot turn around and drive west.)

Given a list of trips, trip[i] = [num_passengers, start_location, end_location] contains information about the i-th trip: the number of passengers that must be picked up, and the locations to pick them up and drop them off. The locations are given as the number of kilometers due east from your vehicle’s initial location.

Return true if and only if it is possible to pick up and drop off all passengers for all the given trips.

Example 1:

Input: trips = [[2,1,5],[3,3,7]], capacity = 4
Output: false

Example 2:

Input: trips = [[2,1,5],[3,3,7]], capacity = 5
Output: true

Example 3:

Input: trips = [[2,1,5],[3,5,7]], capacity = 3
Output: true

Example 4:

Input: trips = [[3,2,7],[3,7,9],[8,3,9]], capacity = 11
Output: true

Constraints:

  1. trips.length <= 1000
  2. trips[i].length == 3
  3. 1 <= trips[i][0] <= 100
  4. 0 <= trips[i][1] < trips[i][2] <= 1000
  5. 1 <= capacity <= 100000
解题思路

   题目的本质含义是一个优先队列的题目,在队列中,队首的元素始终是最早下车的乘客们。可以使用优先队列的地方,往往也可以使用排序,但是时间上会有一定的损失。
   代码如下:

class BusStop
{
public:
	int station;
	int people;

	BusStop(int s, int p) :station(s), people(p) {}

	bool operator<(const BusStop bs) const
	{
		return this->station > bs.station;
	}
};

class Solution {
public:
	bool carPooling(vector<vector<int>>& trips, int capacity) {
		priority_queue<BusStop> q;
		sort(trips.begin(), trips.end(), [](vector<int> a, vector<int> b) {return a[1] < b[1]; });
		int empty = capacity;

		for (auto t : trips)
		{
			while (q.size() > 0 && q.top().station <= t[1])
			{
				empty += q.top().people;
				q.pop();
			}

			if (empty < t[0])
			{
				return false;
			}

			empty -= t[0];
			q.push(BusStop(t[2], t[0]));
		}
		return true;
	}
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值