一、题目展示
1.最初思路
设置一个栈,通过列表不断与栈顶元素比较,如果大于栈顶元素返回数组添加一个“1”,否则遍历当前列表看看到底需要向后查找几个元素比当前栈顶元素大,就添加这个值。
里面遇到了些问题,例如:
for j in range(i,len(temperatures)):
# print(j-i+1)
if temperatures[j]>stack1[top1]:
flag=1
stack2.append(j-i+1)
break
a.一旦找到了大于栈顶元素的值,立刻添加j-i+1,不能继续遍历数组了,那样会出问题。必须break,向后遍历找到大于栈顶值的第一个元素,而不是全部元素
if flag==0:
stack2.append(0)
如果在第二个条件(当前值小于栈顶元素,需要向后遍历找到大于栈顶值的第一个元素),如果找不到该怎么处理,append(0)
2.代码展示
class Solution:
def dailyTemperatures(self, temperatures: List[int]) -> List[int]:
stack1=[]
stack1.append(temperatures[0])
stack2=[]
top1=0
point,find=0,0
for i in range(1,len(temperatures)):
if stack1[top1]<temperatures[i]:
stack2.append(1)
else:
flag=0
for j in range(i,len(temperatures)):
# print(j-i+1)
if temperatures[j]>stack1[top1]:
flag=1
stack2.append(j-i+1)
break
if flag==0:
stack2.append(0)
top1+=1
stack1.append(temperatures[i])
stack2.append(0)
return stack2
但是还是超时了
二、单调栈
1.使用场景
通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时我们就要想到可以用单调栈了。时间复杂度为O(n)
2.单调栈
1.保存的是元素的下标
2.如果当前元素比栈顶元素大,则一直出栈到当前元素不比栈顶元素大或者栈空。
eg:75.71.69 当前元素72 —> 75.72这才是变化之后的情况。当然保存的都是下标。
3.如果当前元素比栈顶元素小,或者为空栈,直接将当前元素入栈即可。
3.本题代码:
循环内部分为两种情形,就是上面2.3所阐述的。
而且每次出栈之后,就对出栈的下标对应的元素进行操作。
class Solution:
def dailyTemperatures(self, temperatures: List[int]) -> List[int]:
stack=[]
result=[0]*len(temperatures)
for i in range(len(temperatures)):
if len(stack)==0 or temperatures[i]<=temperatures[stack[-1]]:
stack.append(i)
while len(stack)!=0 and temperatures[i]>temperatures[stack[-1]]:
result[stack[-1]]=i-stack[-1]
stack.pop()
stack.append(i)
return result