diff --git a/496. Next Greater Element I.md b/496. Next Greater Element I.md new file mode 100644 index 0000000..2572503 --- /dev/null +++ b/496. Next Greater Element I.md @@ -0,0 +1,29 @@ +# [496. Next Greater Element I](https://leetcode.com/problems/next-greater-element-i/description/) +# 思路 +这题暴力法的时间复杂度为O(n^2)。下面介绍更快的方法: +从前往后遍历nums,用一个栈s记录此时还没找到Next-Greater-Element的元素,操作分两步: +* 1、若当前的元素n比s.top大就将栈顶pop出来(s.top的Next-Greater-Element就为n),循环直到元素n小于栈顶或者栈空; +* 2、将n进栈; + +所以栈里的元素肯定是自底向上递减的,例如若nums=[1 6 5 3 4],则当遍历到3时,栈s为[6,5],而3 < s.top() = 5所以直到此时依然没有找到5的Next-Greater-Element,即5不应该pop出来。遍历到4时,s为[6,5,3], +而4 > s.top() = 3, 所以3的Next-Greater-Element找到了,应该将其pop出来,然后4 < s.top() = 5,所以5不应该pop。 +# C++ +``` +class Solution { +public: + vector nextGreaterElement(vector& findNums, vector& nums) { + stack s; + unordered_map mp; // 用hash记录元素的Next-Greater-Element + for (int n : nums) { + while (s.size() && s.top() < n) { // s.top() < n时, s.top()的Next-Greater-Element就是n + mp[s.top()] = n; + s.pop(); // 栈顶元素的Next-Greater-Element找到了,所以应该将栈顶pop出来 + } + s.push(n); // 栈里的元素始终是自底向上递减的 + } + vector res; + for (int n : findNums) res.push_back(mp.count(n) ? mp[n] : -1); + return res; + } +}; +```