HOT 100(七)栈、堆、贪心算法

一、栈

1、每日温度

使用单调递减栈来解决。主要思路是遍历temperatures数组,利用栈来存储还没有找到比当前温度高的天数的索引。当遇到比栈顶索引所对应温度更高的温度时,就可以确定当前这一天的温度比之前那一天高。索引的差值就是等待的天数

求一个元素右边或者左边第一个比它大/小的元素可以用到单调栈。

class Solution:
    def dailyTemperatures(self, temperatures: List[int]) -> List[int]:
        n=len(temperatures)
        stk=[]
        ans=[0]*n
        for i in range(n):
            tmp=temperatures[i]
            while stk and tmp>temperatures[stk[-1]]:
                pre_pos=stk.pop()
                ans[pre_pos]=i-pre_pos
            stk.append(i)
        return ans

2、柱状图中最大的矩形 

代码随想录题解icon-default.png?t=O83Ahttp://【单调栈,又一次经典来袭! LeetCode:84.柱状图中最大的矩形】https://www.bilibili.com/video/BV1Ns4y1o7uB?vd_source=b93b9c2a7846dd3e8bd33feb227c4ac5通过使用单调递增栈来解决这个问题。当遇到一个比栈顶元素低的高度时,说明以栈顶高度为矩形的柱子已经结束,它无法再延伸更大的宽度,因此可以计算这个柱子形成的最大矩形面积。

单调栈的核心是维护一个递增序列。具体思路是:

  • 如果当前柱子的高度大于栈顶柱子的高度,则将当前柱子的索引压入栈。
  • 如果当前柱子的高度小于栈顶柱子的高度,说明栈顶柱子的矩形已经找到了右边界,因此我们可以计算以该柱子为高度的最大矩形面积。

我们要找到直方图中能够形成的最大矩形面积。这个问题的关键在于如何快速计算每个柱子作为矩形高度时,能够向左和向右延伸的宽度。为了高效地解决这个问题,我们使用单调栈,它帮助我们在每次遇到更矮的柱子时回溯并计算以之前柱子为高度的最大矩形面积。

class Solution:
    def largestRectangleArea(self, heights: List[int]) -> int:
        heights=[0]+heights+[0]
        res=0
        stk=[0]
        for i in range(1,len(heights)):
            if heights[i]>heights[stk[-1]]:
                stk.append(i)
            elif heights[i]==heights[stk[-1]]:
                stk.pop()
                stk.append(i)
            else:
                while stk and heights[stk[-1]]>heights[i]:
                    mid_height_pos=stk.pop()
                    mid_height=heights[mid_height_pos]
                    left_edge=stk[-1]
                    right_edge=i
                    res=max(res,(right_edge-left_edge-1)*mid_height)

你可能感兴趣的:(刷题,算法,python)