题目来源:链接: [https://leetcode-cn.com/problems/next-greater-element-i/]
496. 下一个更大元素 I
1.问题描述
给定两个没有重复元素的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集。找到 nums1 中每个元素在 nums2 中的下一个比其大的值。
nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位置的右边的第一个比 x 大的元素。如果不存在,对应位置输出-1。
示例1:
输入: nums1 = [4,1,2], nums2 = [1,3,4,2].
输出: [-1,3,-1]
解释:
对于num1中的数字4,你无法在第二个数组中找到下一个更大的数字,因此输出 -1。
对于num1中的数字1,第二个数组中数字1右边的下一个较大数字是 3。
对于num1中的数字2,第二个数组中没有下一个更大的数字,因此输出 -1。
示例2:
输入: nums1 = [2,4], nums2 = [1,2,3,4].
输出: [3,-1]
解释:
对于num1中的数字2,第二个数组中的下一个较大数字是3。
对于num1中的数字4,第二个数组中没有下一个更大的数字,因此输出 -1。
注意事项:
1. nums1和nums2中所有元素是唯一的。
2. nums1和nums2 的数组大小都不超过1000。
2.我的解决方案
easy 类型题目。不多BB.
我的AC代码:
class Solution {
public:
vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
vector<int> res;
for(auto c : nums1)
{
vector<int>::iterator iter = find(nums2.begin(), nums2.end(), c);
for(iter=iter+1; iter != nums2.end(); ++iter)
{
if(*iter > c)
{
res.push_back(*iter);
break;
}
}
if(*(iter-1) <= c && iter == nums2.end())
{
res.push_back(-1);
}
}
return res;
}
};
3.大神们的解决方案
用时最短的:8ms
通过栈和map 解决。
思路如下:
- 先遍历大数组nums2,首先将第一个元素入栈;
- 继续遍历,当当前元素小于栈顶元素时,继续将它入栈;当当前元素大于栈顶元素时,栈顶元素出栈,此时应将该出栈的元素与当前元素形成key-value键值对,存入Map中;
- 当遍历完nums2后,得到nums2中元素所对应的下一个更大元素的Map表;
- 遍历nums1的元素在Map中去查找‘下一个更大元素’,当找不到时则为-1。
class Solution {
public:
vector<int> nextGreaterElement(vector<int> &findNums, vector<int> &nums) {
int size = nums.size();
vector<int> greater(size, -1);//先初始化成-1 将nums2中的元素与下一个更大元素关联
unordered_map<int, int> val_to_idx;
stack<int> stk;
//寻找nums2中各个元素的下一个更大的元素,并将 这两个 元素进行关联
for (int i = 0; i < size; ++i) {
val_to_idx[nums[i]] = i;
while (stk.size() && nums[stk.top()] < nums[i]) {
greater[stk.top()] = nums[i];
stk.pop();
}
stk.push(i);
}
vector<int> ans;
//开始寻找nums1各个元素x在nums2中第一个比 x 大的元素
for (int num: findNums) {
ans.push_back(greater[val_to_idx[num]]);
}
return ans;
}
};
4.我的收获
继续熟悉 C++的标准库 函数,是个好东西。。。
map 和 find 函数
1.C++ find()函数用法(一般用于vector的查找)[https://blog.csdn.net/zhangweijiqn/article/details/9107571]
2.C++ STL容器之 map
[https://www.cnblogs.com/yutongzhu/p/5884269.html]
2019/4/11 胡云层 于南京 52