当前位置: 首页 > 知识库问答 >
问题:

如何在陷阱雨水问题中实现堆栈,而不是像下面所示以迭代方式解决它?

勾学博
2023-03-14

我正在解决Gfg的雨水收集问题。

我的方法是:对于任何索引,我都会在右侧数组中找到最大元素,在左侧数组中找到最大元素。然后,对于相应的位置,我将找到截留在那里的水,并使用公式将其存储在水中[],公式为:水[I]=最小值(maxL[I],MaxR[I])-数组[I]。(请参阅代码以了解更多信息)

最后,我将返回水中所有元素的总和[]。

代码:

class Solution:
    def trappingWater(self, arr,n):
        maxL=[]    #for storing the maximum on left
        maxR=[]    #for storing the maximum on right
        water=[0]*n
        for i in range(len(arr)):
            if len(maxL)==0:
                mx=arr[i]
            elif arr[i]>mx:
                mx=arr[i]
            maxL.append(mx)
        for i in range(len(arr)-1,-1,-1):
            if len(maxR)==0:
                mx=arr[i]
            elif arr[i]>mx:
                mx=arr[i]
            maxR.append(mx)
        maxR=maxR[::-1]
        
        for i in range(n):
            water[i]=min(maxL[i],maxR[i])-arr[i]
        return sum(water)

但由于这是一个来自堆栈主题的问题,我想知道如何在这个问题中实现堆栈来解决这个问题。

共有1个答案

丁善
2023-03-14

你的方法很好。

只要砌块高度降低,就可以使用堆垛来收集砌块,因为它们可以用作左侧支撑以保持水分。

与您的解决方案相反,然后通过两个(可能较远的)区块之间的水平“跨度”来添加水量。为此,还需要将块的x坐标放置在堆栈上。

当一个条目的高度不大于我们当前访问的块的高度时,它将从堆栈中删除。在这种情况下,需要将一些水量添加到总量中:从堆栈中弹出较低的块,并计算该块上方的水量,介于现在位于堆栈顶部的块(如果有)和当前块之间的左支撑。

下面是脚本中的内容:

class Solution:
    def trappingWater(self, arr, n):
        stack = []
        water = 0
    
        for x, y in enumerate(arr):
            while len(stack) > 0 and stack[-1][1] <= y:
                x1, y1 = stack.pop()  # we will look for water above this block
                if stack:
                    x2, y2 = stack[-1]  # this is the left-sided support for holding water
                    water += (min(y2, y) - y1) * (x - x2 - 1)
            stack.append((x, y))
        return water
 类似资料:
  • 我想接收snmp陷阱,我在snmp4j上获得了它,但现在我正在使用westhawk snmp堆栈库来实现陷阱接收器模块。我使用这个库示例来接收陷阱,但这段代码以rawPdu的形式接收陷阱,当我编辑代码时,我应该怎么做?这是我的代码:

  • 在我的Android应用程序中,我有列表视图和列表项详细信息视图。 Listview和details视图是一个活动中的片段。最初,我将列表片段加载到活动中,如果用户单击列表项,它将用细节片段替换相同的视图,并将该片段添加到一个活动中的backstack中。 代码: 如果用户单击后退按钮,它将进入列表视图,因此没关系。 所以,我的问题是,如果用户在列表项上单击多次(超过10次),应用程序就会因Out

  • 任何人都可以帮助我解决这个问题AndroidManifest.xml mainactivity.kt

  • while (<STDIN>) 一定要小心这点。如果你不知怎么回事地得到了假值(如:空行),你的文件可能 停止处理了。假如你在处理文件读取(除非修改了 $/),这种事一般不会发生, 但却可能发生。 你更喜欢这样运行: while (readdir(DIR)) { 假设你有文件名为 0 的话,那么程序将停止,且不会继续处理文件。 更合适的 while 循环看起来像这样: while ( defin

  • 本文向大家介绍Apache、Nginx下Font Awesome在 Firefox 中不显示问题解决方法,包括了Apache、Nginx下Font Awesome在 Firefox 中不显示问题解决方法的使用技巧和注意事项,需要的朋友参考一下 一、Nginx服务器解决方法 服务器使用的是 Nginx,要在响应的头部添加 Access-Control-Allow-Origin 字段,添加方法是用 a

  • 当从@RestController而不是DTO返回@Entity时,是否存在任何缺陷?这样地: