2022-02-06 每日打卡:Leetcode第279场周赛
写在前面
“这些事儿在熟练之后,也许就像喝口水一样平淡,但却能给初学者带来巨大的快乐,我一直觉得,能否始终保持如初学者般的热情、专注,决定了在做某件事时能走多远,能做多好。” 该系列文章由python编写,所刷题目共三个来源:之前没做出来的 ;Leetcode中等,困难难度题目; 周赛题目;某个专题的经典题目,所有代码已AC。每日1-3道,随缘剖析,希望风雨无阻,作为勉励自己坚持刷题的记录。
T1~T3
没啥问题,做的比较小心,WA了一次,有思路大胆编码!
6003. 移除所有载有违禁货物车厢所需的最少时间
【怎么快速得到思路】:
- 划分问题:前后缀和+枚举分割点
- 是否与前面状态有关:有关动态规划,无关直接前后缀(详见昨天双周赛的最后一题)
- 转移方程:要么…要么…两种情况选择最优即可
比赛时陷入的误区是没有意识到【直接移走的代价可以通过下标直接计算得出】,认为最优解需要维护两种情况。
class Solution:
def minimumTime(self, s: str) -> int:
n = len(s)
suf = [0] * (n + 1)
for i in range(n - 1, -1, -1):
suf[i] = suf[i + 1] if s[i] == '0' else min(suf[i + 1] + 2, n - i)
ans = suf[0]
pre = 0
for i, ch in enumerate(s):
if ch == '1':
pre = min(pre + 2, i + 1)
ans = min(ans, pre + suf[i + 1])
return ans
作者:endlesscheng
链接:https://leetcode-cn.com/problems/minimum-time-to-remove-all-cars-containing-illegal-goods/solution/qian-hou-zhui-fen-jie-dp-by-endlesscheng-6u1b/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
- 优化:将 suf 删除中间车厢的花费合并进 pre 中,因为中间车厢对于删除的位置没有影响,这样suf仅为删除所有后车厢的花费,可以直接使用下标计算出来。
class Solution:
def minimumTime(self, s: str) -> int:
ans = n = len(s)
pre = 0
for i, ch in enumerate(s):
if ch == '1':
pre = min(pre + 2, i + 1)
ans = min(ans, pre + n - 1 - i)
return ans
作者:endlesscheng
链接:https://leetcode-cn.com/problems/minimum-time-to-remove-all-cars-containing-illegal-goods/solution/qian-hou-zhui-fen-jie-dp-by-endlesscheng-6u1b/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。