496. 下一个更大元素 I
https://leetcode-cn.com/problems/next-greater-element-i/
解法一:暴力hash
为nums2建立一个map < int, int> ,key为num2各元素的值,value为元素下标. 然后遍历nums1,对其中每个元素nums1[i],找到其在nums2对应元素j,然后从j向后搜索,找到第一个大于j的就记录,为节省空间,可以直接写入nums1[i] (反正一次遍历,以后也不会再用到). 遍历结束后nums1就是输出.
//cpp
class Solution {
public:
vector<int> nextGreaterElement(vector<int>& findNums, vector<int>& nums) {
unordered_map<int, int> hash;
for (int i = 0; i < nums.size(); i++) {
hash[nums[i]] = i;//建立hash映射
}
for (int i = 0; i < findNums.size(); i++) {
int index = hash[findNums[i]];
int j;
for (j = index+1; j < nums.size(); j++) {
if (nums[j] > nums[index]) {
findNums[i] = nums[j];
break;//找到就立即跳出本层循环
}
}
if (j >= nums.size()) findNums[i] = -1;//若没找到,则为-1
}
return findNums;
}
};解法二:栈+hash
栈用来存储需要找到下一个最大元素的元素。
首先第0号元素入栈,从1号开始遍历nums2,遇到比栈顶大的元素i就将键值对<栈顶,i>写入hash,并将栈顶出栈,直到栈空或者i不大于栈顶,遍历结束就得到<元素,下一个较大元素>的hash。
一次遍历nums1,在hash中查找输出即可。
2021.10.26
解法三:单调栈
从后往前遍历nums2,元素下标依次入栈,元素下标依次入栈,构造一个单调栈,保持栈底最大,栈顶最小。每次i与栈顶比较,若t[i]大于等于栈顶则弹栈,即栈顶是最靠近i的最大元素(下标).
当a = nums2[i]也在nums1中,取栈顶指示的数b, 则b就是a的右边第一个更大值
最后更新于