代码随想录训练营 Day58
今日任务
739.每日温度
496.下一个更大元素Ⅰ
语言:Java
单调栈理论
- 何时用:寻找某一侧第一个比自己大或者小的元素或元素位置
- 单调栈中存放的元素是什么:数组下标
- 单调栈递增还是递减(从栈头到栈底):寻找比自己大的元素-递增,寻找比自己小的元素-递减
- 时间复杂度:O(N)
739. 每日温度
链接:https://leetcode.cn/problems/daily-temperatures/
class Solution {
public int[] dailyTemperatures(int[] temperatures) {
int[] result = new int[temperatures.length];
Stack<Integer> st = new Stack<>();
st.push(0);
for(int i = 1; i < temperatures.length; i++){
if(temperatures[i] > temperatures[st.peek()]){
while(!st.isEmpty() && temperatures[i] > temperatures[st.peek()]){
int idx = st.pop();
result[idx] = i - idx;
}
st.push(i);
}
else if(temperatures[i] <= temperatures[st.peek()]){
st.push(i);
}
}
return result;
}
}
496. 下一个更大元素Ⅰ
链接:https://leetcode.cn/problems/next-greater-element-i/
class Solution {
public int[] nextGreaterElement(int[] nums1, int[] nums2) {
int[] result = new int[nums1.length];
for(int i = 0; i < nums1.length; i++){
result[i] = -1;
}
Stack<Integer> st = new Stack<Integer>();
HashMap<Integer, Integer> umap = new HashMap<Integer, Integer>();
for(int i = 0; i < nums1.length; i++){
umap.put(nums1[i], i);
}
st.push(0);
for(int i = 1; i < nums2.length; i++){
if(nums2[i] <= nums2[st.peek()]){
st.push(i);
}
else{
while(!st.isEmpty() && nums2[i] > nums2[st.peek()]){
if(umap.get(nums2[st.peek()]) != null){
int idx = umap.get(nums2[st.peek()]);
result[idx] = nums2[i];
}
st.pop();
}
st.push(i);
}
}
return result;
}
}