739. 每日温度
关键点1:先前的一些准备
单调栈:单调栈的含义->用栈记录已经遍历过的元素,再将0元素压入栈
结果集:与给定数组一样大小,结果集初始化为0
关键点2:核心部分
for循环遍历给定数组:有两种情况
情况1:if(temperatures[i] <= temperatures[st.peek()]);代表现在temperatures数组的元素值 <= temperatures[数组栈顶数字]的元素值,那此刻将i再压入栈中st.push(i);
情况2:!st.isEmpty() && temperatures[i] > temperatures[st.peek()]代表现在temperatures数组的元素值 > temperatures[栈顶数字]的元素值,那此刻则找到了大于栈顶数字位置对应数值的元素为 temperatures[i] ,对应的位置为i,
记录此时的结果answer[st.peek()] = i - st.peek();
结果记录后弹出栈内比i小的那个数
当结束while循环,则将此时 temperatures[i]的这个i再压入栈中st.push(i);
关键点3:结果
返回answer就行
class Solution {
public int[] dailyTemperatures(int[] temperatures) {
int[] answer = new int[temperatures.length];
Stack st = new Stack<>();
st.push(0);
for(int i = 1; i < temperatures.length;i++){
if(temperatures[i] <= temperatures[st.peek()]){
st.push(i);
}else{
while(!st.isEmpty() && temperatures[i] > temperatures[st.peek()]){
answer[st.peek()] = i - st.peek();
st.pop();
}
st.push(i);
}
}
return answer;
}
}
496.下一个更大元素 I
关键点1:先前的一些准备
单调栈:单调栈的含义->用栈记录已经遍历过的元素,再将0元素压入栈
结果集:与nums1一样大小,结果集初始化为-1
HashMap:用map做nums1与nums2之间的映射,map的key为nums1中的元素,val为nums1中元素的位置
关键点2:核心部分
for循环遍历给定数组:有两种情况
情况1: if(nums2[i] <= nums2[st.peek()]);代表现在temperatures数组的元素值 <= temperatures[数组栈顶数字]的元素值,那此刻将i再压入栈中st.push(i);
情况2:!st.isEmpty()&& nums2[i] > nums2[st.peek()] 代表现在nums2数组的元素值 > nums2[栈顶数字]的元素值,那此刻则找到了大于栈顶数字位置对应数值nums2[st.peek()]的元素为 temperatures[i] ,对应的位置为i(注:用while的原因是判断是一个持续的过程)
关键点3:开始进入映射判断环节
如果map中有这个元素nums2[st.peek()]
获取此时这个元素在map中的值,也就是这个元素对应的下标,Integer index = map.get(nums2[st.peek()]);
记录此时的结果answer[index] = nums2[i];
结果记录后弹出栈内比i小的那个数
当结束while循环,则将此时 temperatures[i]的这个i再压入栈中st.push(i);
关键点3:结果
返回ans就行
class Solution {
public int[] nextGreaterElement(int[] nums1, int[] nums2) {
// 用map做nums1与nums2之间的映射
HashMap map = new HashMap<>();
// map的key为nums1中的元素,val为nums1中元素的位置
for(int i = 0;i < nums1.length;i++){
map.put(nums1[i],i);
}
// ans的长度与nums1有关,ans数组初始化为-1
int[] ans = new int[nums1.length];
Arrays.fill(ans, -1);
Stack st = new Stack<>();
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 nums2[st.peek()]这个元素在map中出现过
if(map.containsKey(nums2[st.peek()])){
Integer index = map.get(nums2[st.peek()]);
ans[index] = nums2[i];
}
// 弹出这个需要放在if条件判断外面
st.pop();
}
st.push(i);
}
}
return ans;
}
}