代码随想录算法训练营第五十八天|739. 每日温度、496.下一个更大元素I

代码随想录 (programmercarl.com)

739. 每日温度

栈里面存放的是元素的下标,确保栈里面的下标对应的元素是单调递增的。

如果栈里面存放的是元素的话,就没有办法定位到下标值,无法计算出距离,所以直接就存入下标。

class Solution {
    public int[] dailyTemperatures(int[] temperatures) {
        int len = temperatures.length;
        int[] res = new int[len];//包含将结果先全部初始化为0
        Deque 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的值,直到遍历到的元素小于栈顶元素之后才能够被压入栈。

代码随想录算法训练营第五十八天|739. 每日温度、496.下一个更大元素I_第1张图片

496.下一个更大元素I  

递增单调栈,遍历nums2,寻找比遍历的元素大的元素,再去判断nums1中是否有该元素,如果有,就需要通过哈希映射找到对应的元素下标,如果没有则需要弹出该元素,继续遍历。

add和push只是最后返回值不一样,add返回布尔类型,而push则返回插入元素的类型。

class Solution {
    public int[] nextGreaterElement(int[] nums1, int[] nums2) {
        Stack temp = new Stack<>();
        temp.push(0);//存入nums2的下标0
//        temp.add(0);//add也可以
        int[] res = new int[nums1.length];
        Arrays.fill(res,-1);
        HashMap 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;
    }
}

你可能感兴趣的:(算法,java,数据结构,开发语言,leetcode)