单调栈 739. 每日温度

一、题目展示

在这里插入图片描述

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值