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]
示例1:
输入: nums1 = [4,1,2], nums2 = [1,3,4,2].
输出: [-1,3,-1]
解释: nums1 中每个值的下一个更大元素如下所述:
- 4 ,用加粗斜体标识,nums2 = [1,3, 4 ,2]。不存在下一个更大的元素,所以答案是 -1 。
- 1 ,用加粗斜体标识,nums2 = [ 1 ,3,4,2]。下一个更大的元素是 3 。
- 2 ,用加粗斜体标识,nums2 = [1,3,4, 2 ]。不存在下一个更大的元素,所以答案是 -1 。
示例2:
输入: nums1 = [2,4], nums2 = [1,2,3,4].
输出: [3,-1]
解释: nums1 中每个值的下一个更大元素如下所述:
- 2 ,用加粗斜体标识,nums2 = [1, 2 ,3,4]。下一个更大的元素是 3 。
- 4 ,用加粗斜体标识,nums2 = [1,2,3, 4 ]。不存在下一个更大的元素,所以答案是 -1 。
提示:
1 <= nums1.length <= nums2.length <= 1000
0 <= nums1[i], nums2[i] <= 104
nums1
和nums2
中所有整数不同nums1
中的所有整数都同样出现在nums2
中
进阶:你可以设计一个时间复杂度的O(nums1.length + nums2.length)
解决方案吗?
解析:
这道题可以用单调栈做,首先将nums1数组存入map中,遍历nums2时可以判断元素是否在nums1中。将nums2数组遍历放入栈中,每次判断栈顶元素是否大于当前元素,大于则直接入栈,小于证明该元素为第一个大于栈顶元素的数字,存储该下标。这个存储的下标数组即为最终结果。
源码:
class Solution {
public:
vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
stack<int> s;
vector<int>result(nums1.size(), -1);
unordered_map<int, int> map;
for (int i = 0; i < nums1.size(); i++) {
map[nums1[i]] = i;
}
s.push(0);
for (int i = 1; i < nums2.size(); i++) {
while (!s.empty() && nums2[s.top()] < nums2[i]) {
if (map.count(nums2[s.top()]) > 0) {
result[map[nums2[s.top()]]] = nums2[i];
}
s.pop();
}
s.push(i);
}
return result;
}
};