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]]:# 栈顶就是中间的柱子:储水槽,就是凹槽的地步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