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;
    }
};

 

posted @ 2018-09-05 11:39  約束の空  阅读(105)  评论(0)    收藏  举报