LeetCode 496. Next Greater Element I
这道题的本质是寻找 数组里比某个元素大的第一个元素。
可以用单调栈来做,维护一个单减的栈,遇到大的元素,出栈知道栈顶元素大于当前元素。该过程中出栈的元素的next greater element就是当前元素。
class Solution { public: vector<int> nextGreaterElement(vector<int>& findNums, vector<int>& nums) { unordered_map<int,int> hash; stack<int> s; for (int num:nums){ while (!s.empty() && s.top()<num){ hash.insert({s.top(),num}); s.pop(); } s.push(num); } vector<int> res(findNums.size(),-1); for (int i=0;i<findNums.size();++i){ if (hash.count(findNums[i])) res[i] = hash[findNums[i]]; } return res; } };
II
循环用 i%n 可以解决,但是这道题相比上一题有了重复的元素,所以stack里存下标更加合适,毕竟元素不唯一。这道题没有需要查找的集合,因此不用hashtable。
需要注意的是 当i>=n时,元素不用入栈,这些元素是为了将之前元素的next greater element找出来的,如果入栈的话,也可能会出现在res里,就不对了。
class Solution { public: vector<int> nextGreaterElements(vector<int>& nums) { int n=nums.size(); vector<int> res(n,-1); stack<int> s; // store index for (int i=0;i<2*n;++i){ int num=nums[i%n]; while (!s.empty() && nums[s.top()]<num){ res[s.top()] = num; s.pop(); } if (i<n) s.push(i); } return res; } };

浙公网安备 33010602011771号