LC每日一题|20240511 - 2391. 收集垃圾的最少总时间
给你一个下标从 0 开始的字符串数组
garbage,其中garbage[i]表示第i个房子的垃圾集合。garbage[i]只包含字符'M','P'和'G',但可能包含多个相同字符,每个字符分别表示一单位的金属、纸和玻璃。垃圾车收拾 一 单位的任何一种垃圾都需要花费1分钟。同时给你一个下标从 0 开始的整数数组
travel,其中travel[i]是垃圾车从房子i行驶到房子i + 1需要的分钟数。城市里总共有三辆垃圾车,分别收拾三种垃圾。每辆垃圾车都从房子
0出发,按顺序 到达每一栋房子。但它们 不是必须 到达所有的房子。任何时刻只有 一辆 垃圾车处在使用状态。当一辆垃圾车在行驶或者收拾垃圾的时候,另外两辆车 不能 做任何事情。
请你返回收拾完所有垃圾需要花费的 最少 总分钟数。
提示:
2 <= garbage.length <= 10^5garbage[i]只包含字母'M','P'和'G'。1 <= garbage[i].length <= 10travel.length == garbage.length - 11 <= travel[i] <= 100
题目等级:Medium
解题思路
这是一道Easy题,只需要记录MPG最后一次出现的时间就可以啦~
具体到车辆行驶到某个房子所需要的时间,可以使用前缀和数组记录。
AC代码
class Solution {
fun garbageCollection(garbage: Array<String>, travel: IntArray): Int {
var last = IntArray(3)
var res = 0
val sum = IntArray(garbage.size)
for (i in garbage.indices) {
res += garbage[i].length
if (i != 0) sum[i] = sum[i - 1] + travel[i - 1]
garbage[i].forEach {
when (it) {
'M' -> last[0] = i
'P' -> last[1] = i
'G' -> last[2] = i
}
}
}
return res + sum[last[0]] + sum[last[1]] + sum[last[2]]
}
}
时间复杂度:O(mn),m指garbage[i]的长度,n指garbage的长度。
空间复杂度:O(n)
当然如果倒序遍历的话,空间复杂度仍有优化空间。
class Solution {
fun garbageCollection(garbage: Array<String>, travel: IntArray): Int {
var b = BooleanArray(3)
var res = garbage[0].length
for (i in garbage.size - 1 downTo 1) {
res += garbage[i].length
garbage[i].forEach {
when (it) {
'M' -> b[0] = true
'P' -> b[1] = true
'G' -> b[2] = true
}
}
b.forEach { if (it) res += travel[i - 1] }
}
return res
}
}
时间复杂度:O(mn)
空间复杂度:O(1)