问题分解
我们将这个问题分解为以下几个小问题:
- 计算每种垃圾(金属、纸、玻璃)在每个房子中的数量。
- 确定每种垃圾车最后到达的房子。
- 计算每种垃圾车行驶的总时间。
- 计算每种垃圾车收拾垃圾的总时间。
- 返回所有垃圾车花费时间的总和。
解决问题
现在让我们逐步解答这些问题:
问题1:计算每种垃圾在每个房子中的数量?
我们可以遍历每个房子的垃圾字符串,统计每种垃圾的数量。
问题2:确定每种垃圾车最后到达的房子?
我们可以在统计垃圾数量的同时,记录每种垃圾车最后到达的房子。
问题3:计算每种垃圾车行驶的总时间?
我们需要遍历travel
数组,对于每种垃圾车,如果当前房子不是它最后到达的房子,那么它需要行驶到下一个房子。
问题4:计算每种垃圾车收拾垃圾的总时间?
在统计垃圾数量的过程中,我们已经计算了每种垃圾车收拾垃圾的总时间。
问题5:返回所有垃圾车花费时间的总和?
我们将每种垃圾车的行驶时间和收拾垃圾的时间相加,得到每种垃圾车的总时间,然后将这些时间相加得到最终答案。
解题答案
根据以上分析,我们可以实现以下代码:
cpp
class Solution {
public:
int garbageCollection(vector<string>& garbage, vector<int>& travel) {
int n = garbage.size();
int metalTime = 0, paperTime = 0, glassTime = 0;
int metalLastHouse = 0, paperLastHouse = 0, glassLastHouse = 0;
// 统计每种垃圾的数量和最后到达的房子
for (int i = 0; i < n; ++i) {
for (char c : garbage[i]) {
if (c == 'M') {
metalTime++;
metalLastHouse = i;
} else if (c == 'P') {
paperTime++;
paperLastHouse = i;
} else if (c == 'G') {
glassTime++;
glassLastHouse = i;
}
}
}
// 计算每种垃圾车的行驶时间
for (int i = 0; i < n - 1; ++i) {
if (i < metalLastHouse) {
metalTime += travel[i];
}
if (i < paperLastHouse) {
paperTime += travel[i];
}
if (i < glassLastHouse) {
glassTime += travel[i];
}
}
// 返回总时间
return metalTime + paperTime + glassTime;
}
};
这段代码首先统计了每种垃圾的数量和最后到达的房子,然后计算了每种垃圾车的行驶时间,最后返回了总时间。这个解法的时间复杂度是O(n),其中n是房子的数量。