• 代码随想录算法训练营19期第58天


    739. 每日温度 

    代码随想录  

    初步思路:暴力解法,两层循

    总结:

    单调栈通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置

    使用单调栈主要有三个判断条件。

    • 当前遍历的元素T[i]小于栈顶元素T[st.top()]的情况: 此时满足递增栈(栈头到栈底的顺序),所以直接入栈.
    • 当前遍历的元素T[i]等于栈顶元素T[st.top()]的情况: 依然直接入栈,因为我们要求的是右边第一个比自己大的元素,而不是大于等于.
    • 当前遍历的元素T[i]大于栈顶元素T[st.top()]的情况:

    1. answer = [0]*len(temperatures)
    2. stack = [0]
    3. for i in range(1,len(temperatures)):
    4. # 情况一和情况二
    5. if temperatures[i]<=temperatures[stack[-1]]:
    6. stack.append(i)
    7. # 情况三
    8. else:
    9. while len(stack) != 0 and temperatures[i]>temperatures[stack[-1]]:
    10. answer[stack[-1]]=i-stack[-1]
    11. stack.pop()
    12. stack. Append(i)

    用时:45分钟

     496.下一个更大元素 I 

    代码随想录  

    初步思路:单调栈

    总结:

    1. 情况一:当前遍历的元素T[i]小于栈顶元素T[st.top()]的情况

    此时满足递增栈(栈头到栈底的顺序),所以直接入栈。

    1. 情况二:当前遍历的元素T[i]等于栈顶元素T[st.top()]的情况

    如果相等的话,依然直接入栈,因为我们要求的是右边第一个比自己大的元素,而不是大于等于!

    1. 情况三:当前遍历的元素T[i]大于栈顶元素T[st.top()]的情况

    此时如果入栈就不满足递增栈了,这也是找到右边第一个比自己大的元素的时候。

    判断栈顶元素是否在nums1里出现过,(注意栈里的元素是nums2的元素),如果出现过,开始记录结果。

    记录结果这块逻辑有一点小绕,要清楚,此时栈顶元素在nums2数组中右面第一个大的元素是nums2[i](即当前遍历元素)。

    1. result = [-1]*len(nums1)
    2. stack = [0]
    3. for i in range(1,len(nums2)):
    4. # 情况一情况二
    5. if nums2[i]<=nums2[stack[-1]]:
    6. stack.append(i)
    7. # 情况三
    8. else:
    9. while len(stack)!=0 and nums2[i]>nums2[stack[-1]]:
    10. if nums2[stack[-1]] in nums1:
    11. index = nums1.index(nums2[stack[-1]])
    12. result[index]=nums2[i]
    13. stack.pop()
    14. stack. Append(i)

    用时:45分钟

  • 相关阅读:
    猿创征文|JAVA 实现《俄罗斯方块升级版》游戏
    通过git命令查询某个用户提交信息
    java 循环跳转控制语句
    倒置边框半径卡片
    UDPNM测试技术分享
    synchronized原理剖析
    torch(四)、Serialization
    多年前C语言学习笔记
    前端HTML5 +CSS3 5.CSS布局 4 浮动
    如何使用PySide2将designer设计的ui文件加载到Python类上鼠标拖拽显示路径
  • 原文地址:https://blog.csdn.net/u013003382/article/details/133115414