单调栈无非两种思路:
第一种是只有比栈顶小的才能进栈,保证栈顶最小;
另一种是比栈顶大的才能进栈,否则弹出栈顶,本题需求是得到左边和右边比其小的,那么其实就是如果比栈顶大,那么栈顶就是需要的,并且进栈; 如果比栈顶小,那么其实栈顶可以pop了,因为栈顶用不着了,使用栈的目的是要保留比栈顶小的。还是要看需求。
O(N)时间复杂度解决~~
左边就从左边开始,如果比上一个小,那么上一个弹出…
右边就从右边开始,如果比上一个大,放入,小也弹出之前的.
# 反正记住优先队列就是有进有出~~这么思考
class Solution:
def foundMonotoneStack(self , nums ):
# write code here
# 左边就从左边开始,如果比上一个小,那么上一个弹出...
# 右边就从右边开始,如果比上一个大,放入,小也弹出之前的.
stack = []
result1 = []
result2 = []
for i in range(len(nums)):
if i == 0:
result1.append(-1)
else:
if nums[i] > nums[stack[-1]]:
result1.append(stack[-1])
else:
while stack and nums[i] < nums[stack[-1]]:
stack.pop()
if stack:
result1.append(stack[-1])
else:
result1.append(-1)
stack.append(i)
stack = []
for i in range(len(nums)-1, -1, -1):
if i == len(nums) - 1:
result2.append(-1)
else:
if nums[i] > nums[stack[-1]]:
result2.append(stack[-1])
else:
while stack and nums[i] < nums[stack[-1]]:
stack.pop()
if stack:
result2.append(stack[-1])
else:
result2.append(-1)
stack.append(i)
results = []
n = len(result1)
for i in range(len(result1)):
results.append([result1[i], result2[n-1-i]])
return results
每日温度
### 记录还没有解决的,如果更小了,记录;当前i肯定是要记录的,但是i可以帮忙消除许多~~
class Solution:
def dailyTemperatures(self, T):
if not T:
return []
result = [0] * len(T)
stack = [0]
for i in range(1, len(T)):
while stack and T[i] > T[stack[-1]]:
index = stack.pop()
result[index] = i - index
stack.append(i)
return result
下一个更大的元素
class Solution:
def nextGreaterElement(self, nums1: List[int], nums2: List[int]) -> List[int]:
stack = []
if not nums1:
return []
res = [-1] * len(nums2)
for i in range(len(nums2)):
if not stack:
stack.append(i)
else:
while stack and nums2[i] > nums2[stack[-1]]:
index = stack.pop()
res[index] = i
stack.append(i)
record = {}
for i in range(len(nums1)):
record[nums1[i]] = 1
for i in range(len(nums2)):
if nums2[i] in record:
record[nums2[i]] = i
result = []
for i in range(len(nums1)):
if res[record[nums1[i]]] != -1:
result.append(nums2[res[record[nums1[i]]]])
else:
result.append(-1)
return result