本文已参与「新人创作礼」活动,一起开启掘金创作之路。
单调栈的应用: ==求解下一个大于x元素或者是小于x元素的位置。==
在这个过程中,维护的是一个单调栈。
算法题目:
稍加分析一下就会发现,和上面上说的差不多。
做题技巧就是:
1、始终要维护一个单调栈,具体看其是递增还是递减;
2、分析判断条件,判断出栈和入栈;
class Solution {
public int[] dailyTemperatures(int[] temperatures) {
//单调栈 详细版
int[] result = new int[temperatures.length];
Stack<Integer> st = new Stack<>();
st.push(0); //栈中存放的是temperatures的下标
for (int i = 1; i < temperatures.length; i++) {
if (temperatures[i] < temperatures[st.peek()]) { //情况一
st.push(i);
}else if (temperatures[i] == temperatures[st.peek()]) { //情况二
st.push(i);
}else {
while (!st.isEmpty() && temperatures[i] > temperatures[st.peek()]) { //情况三
int temp = st.pop();
result[temp] = i - temp;
}
st.push(i);
}
}
return result;
}
}
此题求的是==下一个更大的元素==,而每日温度求的是==下一个更大的下标。==
但是思路是类似的,此题中还要多处理一步:记录nums1的下标
class Solution {
public int[] nextGreaterElement(int[] nums1, int[] nums2) {
//单调栈
int[] result = new int[nums1.length];
Arrays.fill(result,-1);
HashMap<Integer,Integer> hash = new HashMap<>();
Stack<Integer> st = new Stack<>();
for (int i = 0; i < nums1.length; i++) { //记录nums1的下标
hash.put(nums1[i],i);
}
for (int i = 0; i < nums2.length; i++) {
while (!st.isEmpty() && nums2[i] > nums2[st.peek()]) {
if (hash.containsKey(nums2[st.peek()])) {
result[hash.get(nums2[st.peek()])] = nums2[i];
}
st.pop();
}
st.push(i);
}
return result;
}
}