暴力
1. 遍历
class Solution {
public:
vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
vector<int> res(nums1.size());
for (int i = 0; i < nums1.size(); i++) {
int j = 0;
// 还没找到相等的
while (j < nums2.size() && nums1[i] != nums2[j]) j++;
// 找到相等的以后, j 再往后进一位
while (j < nums2.size() && nums2[j] <= nums1[i]) j++;
// 如果还没走到尽头,说明找到了更大的数
if (j < nums2.size())
res[i] = nums2[j];
else
res[i] = -1;
}
return res;
}
};
单调栈
关键是想到把 数组1 中的元素做映射,然后再遍历数组2 ,从数组2 中寻找
class Solution {
public:
vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
stack<int> st;
vector<int> res(nums1.size(), -1);
unordered_map<int,int> map;
// 数组1 中的元素做映射,以便在数组2中找到
for(int i = 0; i < nums1.size(); i++)
map[nums1[i]] = i;
st.push(0);
for(int j = 1; j < nums2.size(); j++)
{
// 这里的逻辑和单调栈一样
if(nums2[j] <= nums2[st.top()])
st.push(j);
else
{
while(!st.empty() && nums2[j] > nums2[st.top()])
{
// 如果在 数组2 中找到了 数组1 的元素
if(map.count(nums2[st.top()]) > 0)
{
// 取出对应数组1的下标
int index = map[nums2[st.top()]];
// 填入与 数组1 对应的下标的新数组中
res[index] = nums2[j];
}
st.pop();
}
st.push(j);
}
}
return res;
}
};