class Solution:
'''
todo 通过单调栈进行复杂度优化,一般都是在高复杂度的情况下可以求解问题,但是不符合时间复杂度要求,需要通过单调栈降低一个复杂度,求滑动窗口的最小值,通常使用单调队列
'''
def boxDelivering(self, boxes: List[List[int]], portsCount: int, maxBoxes: int, maxWeight: int) -> int:
n = len(boxes)
ws = list(accumulate((boxe[1] for boxe in boxes),initial=0))
c = [int(a != b) for a, b in pairwise((boxe[0] for boxe in boxes))]
cs = list(accumulate(c,initial=0))
q = deque([0])
f = [0] * (n + 1)
for i in range(1,n + 1):
# 单调递增,超过范围的去掉
while q and (i - q[0] > maxBoxes or ws[i] - ws[q[0]] > maxWeight):
q.popleft()
# 当前i在可达区间取到最小值
if q:
f[i] = cs[i -1] + f[q[0]] - cs[q[0]] + 2
if i < n:
while q and f[q[-1]] - cs[q[-1]] >= f[i] - cs[i]:
q.pop()
q.append(i)
return f[n]
关于#lc-1687#的问题,请各位专家解答!
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
2条回答 默认 最新
关注让 “紫雾凌寒” 来帮你回答,本回答结合 DeepSeek
如果还有问题,请评论或点击头像私信,如果有帮助到您, 请关注、采纳、点赞
- 关键点分析:
- 题目中提到要通过单调栈来优化复杂度,目标是求滑动相关的问题,但未明确具体的滑动问题描述(例如滑动窗口的最大值、最小值等)。从给出的代码片段看,重点在于利用单调栈优化时间复杂度,可能是针对某种与数组元素滑动相关的计算场景。 - 解决方案示例:
- 假设要求解滑动窗口的最大值问题。
python class Solution: def maxSlidingWindow(self, nums, k): n = len(nums) if n * k == 0: return [] if k == 1: return nums left, right = 0, k - 1 q = deque() for i in range(k): while q and nums[i] >= nums[q[-1]]: q.pop() q.append(i) ans = [nums[q[0]]] while right < n - 1: right += 1 while q and nums[right] >= nums[q[-1]]: q.pop() q.append(right) while q[0] <= left: q.popleft() ans.append(nums[q[0]]) left += 1 return ans
- 解释:- 这里使用了双端队列
deque来维护单调递减的窗口索引。 - 在初始化窗口时,将窗口内的元素索引加入队列
q,并且保证队列中元素对应的nums值是单调递减的。 - 每次滑动窗口时,新元素进入窗口,将队列中小于新元素的索引弹出,保证队列的单调性。
- 同时,当窗口左边界移动时,将不在当前窗口内的队列头部索引弹出。
- 队列头部的索引对应的
nums值就是当前窗口的最大值。
- 这里使用了双端队列
- 多种解决方案的优缺点:
- 单调栈方法:- 优点:时间复杂度可以优化到$O(n)$,相比于暴力解法(每次窗口滑动都遍历窗口内所有元素)的$O(nk)$有很大提升,适用于处理大规模数据。
- 缺点:代码相对复杂,需要理解单调栈的维护机制,调试难度稍高。
- 暴力解法:
- 优点:代码简单易懂,直接按照题目要求实现滑动窗口的遍历。
- 缺点:时间复杂度高,在数据量较大时效率很低。
- 总结:
- 利用单调栈可以有效优化滑动窗口相关问题的时间复杂度。通过合理维护单调栈,可以高效地找到窗口内的最值等信息。在实际应用中,根据具体问题选择合适的方法,如果对时间复杂度要求较高且问题适合用单调栈优化,那么单调栈方法是较好的选择;如果数据量小且追求简单实现,暴力解法也可满足需求。
需要注意的是,由于原始问题中没有完整的具体需求描述,上述示例是基于常见的滑动窗口最大值问题给出的解答,实际应用中应根据具体问题进行调整。
希望以上解答对您有所帮助。如果您有任何疑问,欢迎在评论区提出。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报- 关键点分析: