【python刷题】单调栈

python

python">def template():

stack = []

nums = [2,1,2,4,3]

res = [-1 for _ in range(len(nums))]

for i in range(len(nums)-1,-1,-1):

while stack and nums[i] >= stack[-1]:

stack.pop()

res[i] = stack[-1] if stack else -1

stack.append(nums[i])

return res

res = template()

print(res)

[4,2,4,-1,-1]

496. 下一个更大元素 I

class Solution:

def nextGreaterElement(self, nums1: List[int], nums2: List[int]) -> List[int]:

stack = []

dic = {}

for num in nums2:

while stack and num > stack[-1]:

dic[stack.pop()] = num

stack.append(num)

return [dic.get(i, -1 ) for i in nums1]

739. 每日温度

class Solution:

def dailyTemperatures(self, T: List[int]) -> List[int]:

stack = []

res = [0 for _ in range(len(T))]

for i in range(len(T)-1,-1,-1):

while stack and T[i] >= T[stack[-1]]:

stack.pop()

res[i] = stack[-1] - i if stack else 0

stack.append(i)

return res

503. 下一个更大元素 II

方法一:套用模板,额外的是对于最后一个元素,我们要将数组长度翻倍

class Solution:

def nextGreaterElements(self, nums: List[int]) -> List[int]:

length = len(nums)

nums = nums * 2

stack = []

res = [-1 for _ in range(len(nums))]

for i in range(len(nums)-1,-1,-1):

while stack and nums[i] >= stack[-1]:

stack.pop()

res[i] = stack[-1] if stack else -1

stack.append(nums[i])

print(res)

return res[:length]

方法二:利用循环数组技巧

以下代码让我们可以循环打印数组的值

arr = [1,2,3,4,5]

n = len(arr)

ind = 0

while True:

print(arr[ind % n])

ind += 1

根据上述技巧,我们可以写出以下代码:

class Solution:

def nextGreaterElements(self, nums: List[int]) -> List[int]:

n = len(nums)

stack = []

res = [-1 for _ in range(len(nums))]

for i in range(2*n-1,-1,-1):

while stack and nums[i % n] >= stack[-1]:

stack.pop()

res[i % n] = stack[-1] if stack else -1

stack.append(nums[i % n])

return res

执行步骤:

# n = 3

# 2*3-1 = 5

# i = 5,4,3,2,1,0

# i % n = 2,1,0,2,1,0

i = 5

res = [-1,-1,-1]

stack.append(nums[2]) = [2]

i = 4

while [2] and 4>2:

执行

stack = []

res = [-1,-1,-1]

stack.append(nums[1]) = [4]

i = 3

while [4] and 3>4:

不执行

res = [4,-1,-1]

stack.append(nums[0]) = [4,3]

i = 2

while [4,3] and 2>3:

不执行

res[2] =[4,-1,3]

stack.append(nums[2]) = [4,3,2]

i = 1

while [4,3,2] and 4>2:

执行

stack = []

res = [4,-1,3]

stack.append(nums[1]) = [4]

i = 0

while [4] and 3>4:

不执行

res[nums[0]] = [4,-1,3]

stack.append(nums[0]) = [4,3]

以上是 【python刷题】单调栈 的全部内容, 来源链接: utcz.com/z/386881.html

回到顶部