Problem: 496. 下一个更大元素 I
注意
注意审题: 下面两句话是最重要的
思路
典型的单调栈:
使用递增栈
需要用map对nums1的值和索引进行映射
初始化res为-1
注意:单调栈里面存的是nums2的索引
对nums2进行一个单调栈的入栈
- nums2[i] <= nums2[st.top]
- 符合递增,入栈
- 否则
- while(nums2[i] <= nums2[st.top])
找到了比栈顶元素大的第一个元素
- 如果是栈顶元素是nums[i]
中的元素
- 计算结果集对应栈顶元素的索引位置的值 为 nums2[i]
- 弹出
- 当前索引入栈
复杂度
时间复杂度:
添加时间复杂度, 示例: $O(n)$
空间复杂度:
添加空间复杂度, 示例: $O(n)$
Code
[]1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| class Solution {
public: vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) { vector<int> res(nums1.size(), -1); if (nums1.size() == 0) return res; stack<int> st; unordered_map<int, int> map; st.push(0); for (int i = 0; i < nums1.size(); i++) map[nums1[i]] = i; for (int i = 1; i < nums2.size(); i++) { if (nums2[i] <= nums2[st.top()]) { st.push(i); } else { while (!st.empty() && nums2[i] > nums2[st.top()]) { if (map.find(nums2[st.top()]) != map.end()) { res[map[nums2[st.top()]]] = nums2[i]; } st.pop(); } st.push(i); } } return res; } };
|