今天的题有点难
503. Next Greater Element II
首先这是一个循环cycle的问题,解决这个问题的方法就是copy一遍num到num里面,然后正常的用单调栈去找next greater value就行
class Solution:
def nextGreaterElements(self, nums: List[int]) -> List[int]:
res=[-1 for _ in range(len(nums))]
stack=[]
for i in range(len(nums)*2):
while len(stack)!=0 and nums[i%len(nums)]> nums[stack[-1]]:
res[stack[-1]]=nums[i%len(nums)]
stack.pop()
stack.append(i%len(nums))
return res
42. Trapping Rain Water
这道题比较难.我们先从最简单的方法入手
Way1:
如果是brute force 的话就是想着算每一列所加的水,那么基本思路就是用for循环,对于每一列要找到他的左侧和右侧的最大值,然后确定当前列的值
Way2:
用双指针法可以优化上一个方法.基本思路就是左右两个指针分别指向第一个和最后一个index,然后比较index 对应的value来确定移动那边(移动小的一边).额外要用两个变量存左右边的最大值用来后续的计算
class Solution:
def trap(self, height: List[int]) -> int:
l=0
r=len(height)-1
max_l=max_r=0
res=0
while l < r:
if height[l] < height[r]:
if height[l] >= max_l:
max_l = height[l]
else:
res+=max_l-height[l]
l+=1
else:
if height[r] >= max_r:
max_r = height[r]
else:
res+=max_r-height[r]
r-=1
return res
Way3:
第三种就是用单调栈,基本思路还是上述思路,只不过用单调栈去实现.即nums[i]如果比当前stack的最后一个index对应的值小,则把i放入stack.如果一样则pop上一个存当前的.如果大则不断取出根据左右边界算出值(w*h)
class Solution:
def trap(self, height: List[int]) -> int:
res=0
stack=[0]
for 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 len(stack)!=0 and height[i]>height[stack[-1]]:
mid=height[stack[-1]]
stack.pop()
if stack:
l=height[stack[-1]]
r=height[i]
h=min(r,l)-mid
w=i-stack[-1]-1
res+=h*w
stack.append(i)
return res