本文主要是介绍算法训练营Day59(单调栈2),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
503.下一个更大元素II 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
提醒
这道题和 739. 每日温度 几乎如出一辙,可以自己尝试做一做
class Solution:def nextGreaterElements(self, nums: List[int]) -> List[int]:dp = [-1] * len(nums)stack = []for i in range(len(nums)*2):while(len(stack) != 0 and nums[i%len(nums)] > nums[stack[-1]]):dp[stack[-1]] = nums[i%len(nums)]stack.pop()stack.append(i%len(nums))return dp
42. 接雨水 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
提醒
接雨水这道题目是 面试中特别高频的一道题,也是单调栈 应用的题目,好好做做
建议是掌握 双指针 和单调栈,因为在面试中 写出单调栈可能 有点难度,但双指针思路更直接一些
在时间紧张的情况下,能写出双指针法也是不错的,然后可以和面试官在慢慢讨论如何优化
一、单调栈
class Solution:def trap(self, height: List[int]) -> int:# 单调栈# stack储存index,用于计算对应的柱子高度stack = [0]result = 0for i in range(1, len(height)):# 情况一if height[i] < height[stack[-1]]:stack.append(i)# 情况二# 当当前柱子高度和栈顶一致时,左边的一个是不可能存放雨水的,所以保留右侧新柱子# 需要使用最右边的柱子来计算宽度elif height[i] == height[stack[-1]]:stack.pop()stack.append(i)# 情况三else:# 抛出所有较低的柱子while stack and height[i] > height[stack[-1]]:# 栈顶就是中间的柱子:储水槽,就是凹槽的地步mid_height = height[stack[-1]]stack.pop()if stack:right_height = height[i]left_height = height[stack[-1]]# 两侧的较矮一方的高度 - 凹槽底部高度h = min(right_height, left_height) - mid_height# 凹槽右侧下标 - 凹槽左侧下标 - 1: 只求中间宽度w = i - stack[-1] - 1# 体积:高乘宽result += h * wstack.append(i)return result# 单调栈压缩版
class Solution:def trap(self, height: List[int]) -> int:stack = [0]result = 0for i in range(1, len(height)):while stack and height[i] > height[stack[-1]]:mid_height = stack.pop()if stack:# 雨水高度是 min(凹槽左侧高度, 凹槽右侧高度) - 凹槽底部高度h = min(height[stack[-1]], height[i]) - height[mid_height]# 雨水宽度是 凹槽右侧的下标 - 凹槽左侧的下标 - 1w = i - stack[-1] - 1# 累计总雨水体积result += h * wstack.append(i)return result
二、双指针
class Solution:def trap(self, height: List[int]) -> int:leftheight, rightheight = [0]*len(height), [0]*len(height)leftheight[0]=height[0]for i in range(1,len(height)):leftheight[i]=max(leftheight[i-1],height[i])rightheight[-1]=height[-1]for i in range(len(height)-2,-1,-1):rightheight[i]=max(rightheight[i+1],height[i])result = 0for i in range(0,len(height)):summ = min(leftheight[i],rightheight[i])-height[i]result += summreturn result
这篇关于算法训练营Day59(单调栈2)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!