LeetCode/496. Next Greater Element I.md
2018-10-18 14:24:57 +08:00

30 lines
1.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# [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为[653]而4 > s.top() = 3, 所以3的Next-Greater-Element找到了应该将其pop出来然后4 < s.top() = 5所以5不应该pop
时间复杂度O(n)
# C++
```
class Solution {
public:
vector<int> nextGreaterElement(vector<int>& findNums, vector<int>& nums) {
stack<int> s;
unordered_map<int, int> 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<int> res;
for (int n : findNums) res.push_back(mp.count(n) ? mp[n] : -1);
return res;
}
};
```