给定两个没有重复元素的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集。找到 nums1 中每个元素在 nums2 中的下一个比其大的值。
nums1中数字 x 的下一个更大元素是指 x 在 nums2 中对应位置的右边的第一个比 x 大的元素。如果不存在,对应位置输出-1。
- nums1和nums2中所有元素是唯一的。
- nums1和nums2 的数组大小都不超过1000。
示例一
输入: nums1 = [4,1,2], nums2 = [1,3,4,2].
输出: [-1,3,-1]
解释:
对于num1中的数字4,你无法在第二个数组中找到下一个更大的数字,因此输出 -1。
对于num1中的数字1,第二个数组中数字1右边的下一个较大数字是 3。
对于num1中的数字2,第二个数组中没有下一个更大的数字,因此输出 -1。
示例二
输入: nums1 = [2,4], nums2 = [1,2,3,4].
输出: [3,-1]
解释:
对于num1中的数字2,第二个数组中的下一个较大数字是3。
对于num1中的数字4,第二个数组中没有下一个更大的数字,因此输出 -1。
学习单调栈:单调栈介绍
思路:学习了单调栈就懂了,将nums2中的数字按照递增栈的格式压入栈中(也就是栈中元素从下到上呈递减)。在压入的过程中,如果待压元素比栈顶元素大,先将栈顶元素对应的哈希表的值改为待亚元素的值,再将栈顶元素出栈,再比较待压元素和栈顶元素。循环这个过程直到栈顶元素比待压元素大,然后压栈。最后如果栈中还有元素,则将它们对应哈希表的值改成-1。
vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
stack<int> stk;
vector<int> ans;
map<int, int> mp;
for(int i = 0; i < nums2.size(); i++)
{
if(stk.empty() || nums2[i] < stk.top())
{
stk.push(nums2[i]);
}else
{
while(nums2[i] > stk.top())
{
mp[stk.top()] = nums2[i];
stk.pop();
if(stk.empty()) break;
}
stk.push(nums2[i]);
}
}
while(!stk.empty())
{
mp[stk.top()] = -1;
stk.pop();
}
for(int i = 0; i < nums1.size(); i++)
{
ans.push_back(mp[nums1[i]]);
}
return ans;
}
总结:这题也可以用暴力法:对于nums1的每个元素,在nums2中找到它,假设它的下标为i,那么从第i+1位开始搜索是否存在比它大的,找到就将该值加入记录中,否则加入-1。但是这题主要让我学会了单调栈的用法,多用于解决next great number问题。单调栈趣味解读