在打磨LeetCode时,每次遇到精彩的问题解决方案都会感叹数据结构的伟大,但巧妙的设计可以非常明确地解决问题。
单调堆栈分为单调增加堆栈和单调减少堆栈,是单调增加堆栈,即堆栈中的元素保持单调增加的堆栈。 同样,单调减少堆栈(即堆栈中的元素保持单调减少的堆栈)与单调队列相同,但只使用到其一端,利用它可以解决RQNOJ的“否”队列等ACM/ICPC和OI主题【来源于百度百科的定义】
作用可以在o(1)的时间复杂度中知道位置左侧和右侧比他大(或小)的数量的位置,而在需要高效地获取机灵大地位于位置左侧和右侧比他大(或小)的数量的位置时,作用可以用于单调堆栈。
解答问题
想法可以维持存储下标的单调堆栈,从堆栈底部开始依次减少与堆栈上下标对应的温度列表中的温度。 如果下标位于单调的堆栈中,则表示找不到下一个温度较高的下标。 正向遍历温度列表。
对于温度列表各元素T[i],
如果栈为空,则直接将i进栈,
http://www.Sina.com/http://www.Sina.com /
http://www.Sina.com/http://www.Sina.com /
重复上述操作,直到堆栈为空或堆栈顶部元素对应的温度低于当前温度,然后将I放入堆栈中。
如果栈不为空,则比较栈顶元素
因为在这种情况下,与进入堆栈的I相对应的T[i]始终是T[prevIndex]右边第一个大于它的元素。 请想想,如果prevIndex和I有更大的元素,而下标为j,则prevIndex一定会在下标j的圈上被弹出。
由于单调堆栈满足与堆栈底部到堆栈顶部的元素相对应的温度下降,因此每次堆栈元素时,会删除所有温度较低的元素,并更新与堆栈元素相对应的等待天数。 这样,等待天数一定最小。
prevIndex对应的温度T[prevIndex]和当前温度T[i],
对于温度列表[73、74、75、71、69、72、76和73],单调堆栈的初始状态为空。 其结果,result的初始状态为[0、0、0、0、0、0、0、0、0、0],单调堆栈内的答案按以下步骤更新
i=0时,单调堆栈为空,所以将0放入堆栈中。
sack=[0(73 ) ]
result=[0、0、0、0、0、0、0、0]
如果i=1,则75大于74,删除堆栈顶部元素1,分配result[0]=1-0,并将1放入堆栈中。
sack=[1(74 ) ]
result=[ 1,0,0,0,0,0,0,0 ]
如果i=2,则74大于73,删除堆栈顶部元素1,分配result[1]=2-1,并将1放入堆栈中。
sack=[2(75 ) ]
result=[ 1,1,0,0,0,0,0,0 ]
i=3时,71小于75,所以将3放入堆栈中
sack=[2(75 ),3 ) 71 ] ]
result=[ 1,1,0,0,0,0,0,0 ]
i=4时,69小于71,因此将4放入堆栈中
堆叠=[2(75 ),3 ) 71 ),4 ) 69]
result=[1、1、0、0、0、0、0、0]
如果i=5,则72大于69和71,因此按顺序删除堆栈顶部元素4和3,分配result[4]=5-4和result[3]=5-3,并将5放入堆栈中。
sack=[2(75 ),3 ) 72 ] ]
result=[ 1,1,0,2,1,0,0 ]
如果i=6,则76大于72和75,因此按顺序删除堆栈顶部元素5和2,分配result[5]=6-5和result[2]=6-2,并将6放入堆栈中。
sack=[2(75 ),3 ) 72 ] ]
result=[ 1,1,0,2,1,0,0 ]
如果I=7,73小于76,所以将7放入堆栈中。
堆叠=[6(76 ),7 ) 73 ] ]
result=[ 1,1,4,2,1,1,0,0 ]
Swift解题代码funcdailytemperatures (_ t : [ int ]-[ int ] { varresult=array (repeating 3360,count: T.count ) var sult ] value { letpreindex=stack.poplast (! result [ pre index ]=index-pre index } stack.append (index ) } return result } (返回结果测试之路)关注公众号,欢迎返回【领取资源】
Python编程学习资源的干货、
Python Appium框架APP的UI自动化、
Python Selenium框架Web的UI自动化、
Python Unittest框架自动化API、
资源和代码免费送到~
文章下面有公众号的二维码,直接微信扫清兴趣就行了。
如果
T[i] T[prevIndex],则将prevIndex移除,并将prevIndex对应的等待天数赋为i - prevIndex,