代码随想录 (programmercarl.com)
739. 每日温度
栈里面存放的是元素的下标,确保栈里面的下标对应的元素是单调递增的。
如果栈里面存放的是元素的话,就没有办法定位到下标值,无法计算出距离,所以直接就存入下标。
class Solution {
public int[] dailyTemperatures(int[] temperatures) {
int len = temperatures.length;
int[] res = new int[len];//包含将结果先全部初始化为0
Deque<Integer> stack = new LinkedList<>();
stack.push(0);//此时栈顶元素就是temperatures[0]所对应的下标!栈里面存放的是下标
for (int i = 1; i < len; i++) {
if (temperatures[i] <= temperatures[stack.peek()]){
stack.push(i);
}else{
while (!stack.isEmpty() && temperatures[i] > temperatures[stack.peek()]){
res[stack.peek()] = i - stack.peek();
stack.pop();
}
stack.push(i);//全部比较完之后,确定没有比该元素还要小的元素之后才能压入栈
}
}
return res;
}
}
注意:stack.push(i);的位置在while循环之外,遍历到的元素只要大于栈顶元素就不能被压入栈,而应该继续改变res的值,直到遍历到的元素小于栈顶元素之后才能够被压入栈。
496.下一个更大元素I
递增单调栈,遍历nums2,寻找比遍历的元素大的元素,再去判断nums1中是否有该元素,如果有,就需要通过哈希映射找到对应的元素下标,如果没有则需要弹出该元素,继续遍历。
add和push只是最后返回值不一样,add返回布尔类型,而push则返回插入元素的类型。
class Solution {
public int[] nextGreaterElement(int[] nums1, int[] nums2) {
Stack<Integer> temp = new Stack<>();
temp.push(0);//存入nums2的下标0
// temp.add(0);//add也可以
int[] res = new int[nums1.length];
Arrays.fill(res,-1);
HashMap<Integer, Integer> hashMap = new HashMap<>();
for (int i = 0 ; i < nums1.length ; i++){
//构建哈希映射K-V,其中key是nums1[i],value是i
hashMap.put(nums1[i],i);
}
for (int i = 1; i < nums2.length; i++) {
if (nums2[i] <= nums2[temp.peek()]){
temp.push(i);
}else {
while (!temp.isEmpty() && nums2[i] > nums2[temp.peek()]){
if (hashMap.containsKey(nums2[temp.peek()])){
int index = hashMap.get(nums2[temp.peek()]);
res[index] = nums2[i];//此时的结果应当是遍历到的nums2中的元素
}
temp.pop();
//在判断条件外面,因为如果不满足上面的if判断,也要将该元素弹出栈
}
temp.push(i);
//全部比较完之后,确定没有比该元素还要小的元素之后才能压入栈,理由同上739
}
}
return res;
}
}