【代码随想录刷题记录】 739. 每日温度 、 496.下一个更大元素 I

739. 每日温度

1、题目
给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。

题目链接:https://leetcode.cn/problems/daily-temperatures/

2、代码

class Solution {
public:
//暴力法
    vector<int> dailyTemperatures(vector<int>& temperatures) {
        stack<int> st;
        vector<int> answer(temperatures.size(), 0);
        st.push(0);
        for(int i = 1; i < temperatures.size(); i++){
            if(temperatures[i] > temperatures[st.top()]){//遇到第一个大于的情况
                while(!st.empty() && temperatures[i] > temperatures[st.top()]){
                    answer[st.top()] = i - st.top();
                    st.pop();
                }
                st.push(i);
            }
            else if(temperatures[i] < temperatures[st.top()]){
                st.push(i);
            }
            else if(temperatures[i] == temperatures[st.top()]){
                st.push(i);
            }
        }
        return answer;
        
    }
};

3、小结
使用栈用于记录当前遍历过的数组元素的下标,遇到当前元素小于等于栈顶元素时直接将当前元素压入栈中即可,遇到当前元素大于栈顶元素时,将栈顶元素取出并完成对应操作一直到栈顶元素小于当前元素或者栈为空再将当前元素压入栈。

496.下一个更大元素 I

1、题目
对于每个 0 <= i < nums1.length ,找出满足 nums1[i] == nums2[j] 的下标 j ,并且在 nums2 确定 nums2[j] 的 下一个更大元素 。如果不存在下一个更大元素,那么本次查询的答案是 -1 。
返回一个长度为 nums1.length 的数组 ans 作为答案,满足 ans[i] 是如上所述的 下一个更大元素 。

题目链接:https://leetcode.cn/problems/next-greater-element-i/

2、代码

class Solution {
public:
    vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
        //定义变量
        stack<int> st;
        vector<int> result(nums1.size(), -1);
        //特殊情况
        if(nums1.size() == 0) return result;
        //使用集合用于通过数值找在nums1中的下标,对nums2进行遍历
        unordered_map<int, int> umap; // key:下标元素,value:下标
        for (int i = 0; i < nums1.size(); i++) {
            umap[nums1[i]] = i;
        }
        st.push(0);
        for(int j = 1; j < nums2.size(); j++){
            if(nums2[j] > nums2[st.top()]){
                while(!st.empty() && nums2[j] > nums2[st.top()]){
                    if(umap.find(nums2[st.top()]) != umap.end()){
                        int index = umap[nums2[st.top()]];
                        result[index] = nums2[j];
                    }
                    st.pop();
                }
            }
            st.push(j);
        }
        return result;
    }
};

3、小结
本题与上题类似,使用nums2进行寻找下一个更大的数以及使用集合来记录nums1中的数值和对应下标。在对nums2进行处理的过程中,判断栈顶下标对应的nums2中的值在nums1中是否存在以及如果存在下标为多少,并进行相应的赋值操作。

你可能感兴趣的:(leetcode)