-
题意:
给定两个数组,数组1为数组2的子集,遍历数组1,求出数组1中每个元素在数组2中该元素右边的第一个比该数大的元素,若不存在,则返回-1.
eg: nums1=[4,2,3,1] nums2=[3,4,5,1,2]
遍历数组1,对于元素4,更大的元素为5,对于元素2,因数组2右边没有元素了,返回-1,对于元素3,返回元素4,对于元素1,返回元素2.
-
解题思路:
-
暴力求解
遍历每个元素,求出在nums2中的位置,再遍历其右边的元素得到较大值。此方法会超时。
-
使用stack和map求解
先忽略数组1,遍历数组2,使用栈将当前元素入栈,判断下一个元素是否大于栈顶元素,若大于,则
判断栈不空且下一个元素大于栈顶元素,则loop:{
将map元素(栈顶元素,下一个元素)加入到map中
}
map中key值为元素值,value值为下一个更大元素,结果便可通过遍历数组1,取得map中相对应的value。
-
- Code
#include <cmath>
#include <iostream>
#include <map>
#include <stack>
#include <vector>
using namespace std;
class Solution {
public:
vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
vector<int> res;
if (nums1.size() == 0 || nums2.size() == 0) {
return res;
}
stack<int> s;
map<int, int> m;
for (int i = 0; i < nums2.size() - 1; i++) {
s.push(nums2[i]);
while (!s.empty() && nums2[i + 1] > s.top()) {
m.insert(pair<int, int>(s.top(), nums2[i + 1]));
s.pop();
}
}
while (!s.empty()) {
m.insert(pair<int, int>(s.top(), -1));
s.pop();
}
m.insert(pair<int, int>(nums2[nums2.size() - 1], -1));
for (int i = 0; i < nums1.size(); i++) {
res.push_back(m[nums1[i]]);
}
return res;
}
};
int main() {
vector<int> s1 = {1, 2};
vector<int> s2 = {3, 1, 2};
Solution s;
s.nextGreaterElement(s1, s2);
return 0;
}