- 739. 每日温度
- 496.下一个更大元素 I
第一题:每日温度
请根据每日 气温 列表,重新生成一个列表。对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用 0 来代替。
例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。
单调栈使用场景:通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时我们就要想到可以用单调栈了。
有点妙,三种情况:
- 情况一:当前遍历的元素T[i]小于栈顶元素T[st.top()]的情况
- 情况二:当前遍历的元素T[i]等于栈顶元素T[st.top()]的情况
- 情况三:当前遍历的元素T[i]大于栈顶元素T[st.top()]的情况
计算公式:
result[st.top()]=i-st.top()
首先第一个元素入栈
然后第二个元素入栈,第二个元素比第一个元素大,第一个元素弹出去,result[0]=1-0=1
然后第三个元素入栈,第三个元素比第二个元素大,第二个元素弹出去,result[1]=2-1=1
然后第四个元素入栈,第四个元素比第三个元素小
然后第五个元素入栈,第五个元素跟第四个元素相同
然后第六个元素入栈,第六个元素大于第五个元素,第五个元素弹出去,result[4]=5-4=1
第六个元素比第四个元素大,第四个元素弹出去,result[3]=5-3=2
然后第七个元素入栈,第七个元素比第三个元素大,第三个元素弹出去,result[2]=6-2=4
然后第八个元素入栈,第八个元素比第七个元素小,不做操作
总结:最后代码精简的时候,只需要考虑新来的元素比st.top小的情况
第二题:下一个最大元素1
给你两个 没有重复元素 的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集。
请你找出 nums1 中每个元素在 nums2 中的下一个比其大的值。
nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位置的右边的第一个比 x 大的元素。如果不存在,对应位置输出 -1 。
示例 1:
输入: nums1 = [4,1,2], nums2 = [1,3,4,2].
输出: [-1,3,-1]
首先用map来做映射,根据数值找到下标。还可以判断nums2[i]是否在nums1中出现过。
将两个数组组合到一个unordered_map上 ,后面处理的时候根据map找到nums2[st.top()]在nums1中的下标。再用该下标求得位置结果。
然后用前面温度的方法求出结果。