Leetcode 3494. Find the Minimum Amount of Time to Brew Potions
- Leetcode 3494. Find the Minimum Amount of Time to Brew Potions
- 1. 解题思路
- 2. 代码实现
- 题目链接:3494. Find the Minimum Amount of Time to Brew Potions
1. 解题思路
这道题虽说算是搞定了,通过了全部的测试样例,不过还是很暴力的求解的,整体的算法复杂度还是 O ( N M ) O(NM) O(NM),应该只是勉勉强强没有超时吧,没想到啥更好的思路……
我这边的思路的话其实就是非常暴力的遍历求每一轮的最早开始的时间,显然,当前一轮最早的开始时间需要满足此时每一个人手上都是空闲的,即要求遍历每一个巫师时,满足条件当前一轮当中他们之前所有人完成工作的时间点不小于他完成上一轮工作的时间,即:
s
t
a
r
t
j
+
∑
k
=
0
i
−
1
s
k
i
l
l
k
×
m
a
n
a
j
≥
s
t
a
r
t
j
−
1
+
∑
k
=
0
i
s
k
i
l
l
k
×
m
a
n
a
j
−
1
\mathop{start}_{j} + \sum\limits_{k=0}^{i-1}\mathop{skill}_k \times \mathop{mana}_j \geq \mathop{start}_{j-1} + \sum\limits_{k=0}^{i}\mathop{skill}_k \times \mathop{mana}_{j-1}
startj+k=0∑i−1skillk×manaj≥startj−1+k=0∑iskillk×manaj−1
由此,我们即可得到每一轮的最早开始时间,进而,我们即可求得最早的完成时间。
2. 代码实现
给出python代码实现如下:
class Solution:
def minTime(self, skill: List[int], mana: List[int]) -> int:
n, m = len(skill), len(mana)
cumsum_skill = list(accumulate(skill, initial=0))
st = [0 for _ in range(m)]
for j in range(1, m):
for i in range(n):
st[j] += max(0, st[j-1] + cumsum_skill[i+1]*mana[j-1] - st[j] - cumsum_skill[i]*mana[j])
return st[-1] + cumsum_skill[-1] * mana[-1]
提交代码评测得到:耗时14843ms,占用内存18.2MB。