LeetCode第11天 huawei 测试题 单调栈

84. 柱状图中最大的矩形
给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。

class Solution:
    def largestRectangleArea(self, heights: List[int]) -> int:
        left=[0]*len(heights)
        right=[0]*len(heights)
        stack=[]
        if len(heights)==0:
            return 0
        for i in range(0,len(heights)):
            while stack and heights[stack[-1]] >= heights[i]:
                stack.pop()

            if len(stack)==0:
                left[i]=-1
            else:
                left[i]=stack[-1]
            stack.append(i)
        stack=[]
        for i in range(len(heights)-1,-1,-1):
            while stack and heights[stack[-1]] >= heights[i]:
                stack.pop()

            if len(stack)==0:
                right[i]=len(heights)
            else:
                right[i]=stack[-1]
            stack.append(i)
        

        max_=0
        for i in range(len(heights)):
            max_=max(max_,heights[i]*(right[i]-left[i]-1))

        return max_

739. 每日温度
给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。

class Solution:
    def dailyTemperatures(self, temperatures: List[int]) -> List[int]:
        position=[0]*len(temperatures)
        #暴力破解
        # for i in range(len(temperatures)-1):
        #     for j in range(i+1,len(temperatures)):
        #         if temperatures[j]>temperatures[i]:
        #             position[i]=j-i
        #             break
        # return position
        #单调栈
        stack=[0]
        for i in range(1,len(temperatures)):
            # pp=i
            while stack and  temperatures[stack[-1]]<temperatures[i]:
                pp=stack.pop()
                position[pp]=i-pp
            stack.append(i)
            
        return position

503. 下一个更大元素 II
给定一个循环数组 nums ( nums[nums.length - 1] 的下一个元素是 nums[0] ),返回 nums 中每个元素的 下一个更大元素 。

数字 x 的 下一个更大的元素 是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1 。

class Solution:
#利用单调栈和下标取模实现循环数组
    def nextGreaterElements(self, nums: List[int]) -> List[int]:
        n=len(nums)
        position=[-1]*len(nums)
        stack=[0]
        for i in range(1,n * 2 - 1):
            # pp=i
            while stack and  nums[stack[-1]]<nums[i%n]:
                pp=stack.pop()
                position[pp]=nums[i%n]
            stack.append(i%n)
        return position

你可能感兴趣的:(Leetcode,leetcode,算法)