先将第一个遍历元素T[0] = 73加入单调栈,下标为0 加入T[1] = 74,因为T[1] > T[0](当前遍历的元素T[i]大于栈顶元素T[st.top()]的情况),而需要保持一个递增单调栈(从栈头到栈底),所以将T[0]弹出,T[1]加入,此时result数组可以记录了,result[0] = 1,即T[0]右边第一个比T[0]大的元素是T...
如果一个下标在单调栈里,则表示尚未找到下一次温度更高的下标。 正向遍历温度列表。对于温度列表中的每个元素 temperatures[i],如果栈为空,则直接将 i 进栈,如果栈不为空,则比较栈顶元素 prevIndex 对应的温度 temperatures[prevIndex] 和当前温度 temperatures[i],如果 temperatures[i] > temperatures[prevIndex],...
情况一:当前遍历的元素T[i]小于栈顶元素T[st.top()]的情况 情况二:当前遍历的元素T[i]等于栈顶元素T[st.top()]的情况 情况三:当前遍历的元素T[i]大于栈顶元素T[st.top()]的情况 classSolution{public:vector<int>dailyTemperatures(vector<int>&T){// 递增栈stack<int>st;// 单调栈vector<int>resul...
1、遍历整个数组,如果栈不空,且当前数字大于栈顶元素则取出栈顶元素,由于当前数字大于栈顶元素的数字,而且一定是第一个大于栈顶元素的数,直接求出下标差就是二者的距离 2、继续看新的栈顶元素,直到当前数字小于等于栈顶元素停止,然后将数字入栈,这样就可以一直保持递减栈,且每个数字和第一个大于它的数的距离也可...
解法二(单调栈) class Solution { public: //维护一个从栈底到栈顶从大到小的栈 stack<int> stk; vector<int> dailyTemperatures(vector<int>& temperatures) { int len=temperatures.size(); for(int i=0;i<len;i++){ while(!stk.empty()){ ...
通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时我们就要想到可以用单调栈了。时间复杂度为 O(n)。例如本题其实就是找找到一个元素右边第一个比自己大的元素。此时就应该想到用单调栈了。那么单调栈的原理是什么呢?为什么时间复杂度是 O(n)就可以找到每一个元素的右边第...
[temperatures.length];}// 2 定义单调递减栈,单调栈存储当前温度下标,和返回结果集Stack<Integer> singleStack = new Stack<Integer>();int[] result = new int[temperatures.length];// 3 遍历数组,进行温度结算for (int i = 0; i < temperatures.length; i++) {// 如果满足结算条件,进行结算while (...
单调栈 正序遍历 代码实现 思路分析 接着,我们看下单调栈求解的具体思路。 对于第一天的温度73来说,它是第一个被考察的温度,这时我们还不知道其后面是否有比其高的温度,所以需要将其对应的索引0入栈。 接着,考察第二天的温度74。这时,我们发现第二天温度74大于第一天温度73。因此,对于第一天温度73来说,找到...
单调栈(此题是递减栈——栈里只有递减元素),用一个栈装数组下标。 具体操作: 遍历一次数组,对应数组元素若大于栈顶元素(如果有元素),如果直接将该数组元素元素入栈,则【递减栈】不成立,所以不能将数组元素入栈——当前下标和【栈顶元素所在数组的下标】的差,最后将栈顶元素出栈; ...
单调栈:stack = [] 结果:res = [] p=0时,栈空,0直接入栈,stack=[0] p=1时,栈顶值是0,temperatures[1]大于temperatures[0],0出栈,同时res[0] = 1-0, 此时栈空,1直接入栈,stack=[1] p=2同理,res[1] = 2-1,stack=[2] p=3时, 栈顶值是2,temperatures[3]小于temperatures[2],3入栈,...