输入:
-
一个数组
nums1。 -
一个数组
nums2。 -
约束:
nums1是nums2的子集,且两个数组都没有重复元素。
要求:
-
遍历
nums1中的每一个元素x。 -
在
nums2中找到x的位置。 -
从该位置开始向右查找,找出第一个比
x大的数
输出:
-
一个与
nums1等长的答案数组ans。 -
ans[i]对应nums1[i]找到的“下一个更大元素”。 -
如果找不到,则存入
-1。
思路:遍历一次 nums2,计算出 nums2 中所有元素的“下一个更大元素”是谁,并把这个 {值 -> 答案} 的关系存入一个哈希表。最后再遍历 nums1,去哈希表里查答案就行了。
复杂度:
时间复杂度:O(N+M) 遍历nums1 和 nums2
空间复杂度:O(M) nums2的大小为基准
class Solution {
public:
vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
stack<int> t1; // 存索引
unordered_map<int, int> t2;
for (int i = 0; i < nums2.size(); i++) {
t2[nums2[i]] = -1;
}
for (int i = 0; i < nums2.size(); i++) {
if (!t1.empty() && nums2[i] > nums2[t1.top()]) {
t2[nums2[t1.top()]] = nums2[i];
t1.pop();
//此处i--是为了不断弹出栈内所有比当前数小的数
//可能不直观 也可以改成while写法
i--;
}
else {
t1.push(i);
}
}
vector<int> ans;
for (int num : nums1) {
ans.push_back(t2[num]);
}
return ans;
}
};
1631

被折叠的 条评论
为什么被折叠?



