2023.8.28
这题提供暴力解法和单调栈法两种方法。
暴力解:
class Solution {
public:vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {vector<int> ans(nums1.size(),-1);for(int i=0; i<nums1.size(); i++){int j=0;while(j<nums2.size() && nums2[j]!=nums1[i]) j++;j++;while(j<nums2.size() && nums2[j]<=nums1[i]) j++;if(j!=nums2.size()) ans[i] = nums2[j];}return ans;}
};
单调栈:
题中说了数组中没有重复的元素,为了避免重复遍历nums2数组,可以用一个哈希map和单调栈stack将nums2数组中的每个元素对应其查询值存储在map中,类似于每日温度。然后再遍历nums1查询相应元素对应的查询值。 代码如下:
class Solution {
public:vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {unordered_map<int,int> hashmap;stack<int> stk;for(int i=nums2.size()-1; i>=0; i--){while(!stk.empty() && nums2[i]>=stk.top()) stk.pop();hashmap[nums2[i]] = stk.empty()? -1 : stk.top(); //栈为空说明没有比当前元素更大的元素了,即查询结果为-1。stk.push(nums2[i]);}vector<int> ans(nums1.size());for(int i=0; i<nums1.size(); i++){ans[i] = hashmap[nums1[i]];}return ans;}
};