496. 下一个更大元素 I

发布于:2024-07-05 ⋅ 阅读:(13) ⋅ 点赞:(0)

nums1 中数字 x 的 下一个更大元素 是指 x 在 nums2 中对应位置 右侧 的 第一个 比 x 大的元素
给你两个 没有重复元素 的数组 nums1 和 nums2 ,下标从 0 开始计数,其中nums1 是 nums2 的子集。
对于每个 0 <= i < nums1.length ,找出满足 nums1[i] == nums2[j] 的下标 j ,并且在 nums2 确定 nums2[j] 的 下一个更大元素 。如果不存在下一个更大元素,那么本次查询的答案是 -1 。
返回一个长度为 nums1.length 的数组 ans 作为答案,满足 ans[i] 是如上所述的 下一个更大元素

本题和每日温度的区别是,需要从nums1中提取元素,然后在nums2中寻找下一个更大元素,因此,我们在nums2中寻找到下一个最大元素时,需要找到当前栈顶元素在nums1中的对应位置,以此来更新存放结果的数组。

那么,首先是res数组的定义以及初始化,由于存放的是nums1中的结果,所以res数组大小为nums1.size(),题目说如果不存在对应位置就输出 -1 ,所以result数组如果某位置没有被赋值,那么就应该是是-1,所以就初始化为-1。

其次,在遍历nums2数组时,我们要寻找是否在nums1中出现过,因为最后是要根据nums1元素的下标来更新result数组。注意题目中说是两个没有重复元素 的数组 nums1 和 nums2。没有重复元素,我们就可以用map来做映射了。根据数值快速找到下标,还可以判断nums2[i]是否在nums1中出现过。

代码如下:

class Solution {
public:
    vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
        vector<int> res(nums1.size(), -1);
        stack<int> st;
        
        unordered_map<int, int> map;
        for(int i = 0; i < nums1.size(); i++) {
            map.insert(make_pair(nums1[i], i));
        }
        st.push(0);
        for(int i = 1; i < nums2.size(); i++) {
            if(nums2[i] <= nums2[st.top()]){
                st.push(i);
            }else{
                while(!st.empty() && nums2[i] > nums2[st.top()]){
                    if(map.find(nums2[st.top()]) != map.end()) {
                        int index = map[nums2[st.top()]];
                        res[index] = nums2[i];
                    }
                    st.pop();
                }
                st.push(i);
            }
        }
        return res;
    }
};