代码随想录 (programmercarl.com)
739. 每日温度
栈里面存放的是元素的下标,确保栈里面的下标对应的元素是单调递增的。
如果栈里面存放的是元素的话,就没有办法定位到下标值,无法计算出距离,所以直接就存入下标。
class Solution {public int[] dailyTemperatures(int[] temperatures) {int len = temperatures.length;int[] res = new int[len];//包含将结果先全部初始化为0Deque<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是ihashMap.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;}
}