LC每日一题|20240511 - 2391. 收集垃圾的最少总时间

79 阅读2分钟

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^5
  • garbage[i] 只包含字母 'M' ,'P' 和 'G' 。
  • 1 <= garbage[i].length <= 10
  • travel.length == garbage.length - 1
  • 1 <= 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)