496. 下一个更大元素 I

https://leetcode-cn.com/problems/next-greater-element-i/

解法一:暴力hash

为nums2建立一个map < int, int> ,key为num2各元素的值,value为元素下标. 然后遍历nums1,对其中每个元素nums1[i],找到其在nums2对应元素j,然后从j向后搜索,找到第一个大于j的就记录,为节省空间,可以直接写入nums1[i] (反正一次遍历,以后也不会再用到). 遍历结束后nums1就是输出.

//cpp
class Solution {
public:
    vector<int> nextGreaterElement(vector<int>& findNums, vector<int>& nums) {
        unordered_map<int, int> hash;
        for (int i = 0; i < nums.size(); i++) {
            hash[nums[i]] = i;//建立hash映射
        }
        for (int i = 0; i < findNums.size(); i++) {
            int index = hash[findNums[i]];
            int j;
            for (j = index+1; j < nums.size(); j++) {
                if (nums[j] > nums[index]) {
                    findNums[i] = nums[j];
                    break;//找到就立即跳出本层循环
                }                
            }
            if (j >= nums.size()) findNums[i] = -1;//若没找到,则为-1
        }
        return findNums;
    }
};

解法二:栈+hash

栈用来存储需要找到下一个最大元素的元素

首先第0号元素入栈,从1号开始遍历nums2,遇到比栈顶大的元素i就将键值对<栈顶,i>写入hash,并将栈顶出栈,直到栈空或者i不大于栈顶,遍历结束就得到<元素,下一个较大元素>的hash。

一次遍历nums1,在hash中查找输出即可。

2021.10.26

解法三:单调栈

从后往前遍历nums2,元素下标依次入栈,元素下标依次入栈,构造一个单调栈,保持栈底最大,栈顶最小。每次i与栈顶比较,若t[i]大于等于栈顶则弹栈,即栈顶是最靠近i的最大元素(下标).

a = nums2[i]也在nums1中,取栈顶指示的数b, 则b就是a的右边第一个更大值

最后更新于