Leetcode 496 Next Greater Element I

这道题虽然是一系列“下一个更大的元素”中的第 1 个,实际上还有一个第 0 题:Leetcode 739 Daily Temperatures

这是一道单调栈题,可以从第 0 题简单修改而来:


class Solution {
 public:
  vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
    const int n = nums2.size();
    unordered_map<int, int> m;
    vector<int> nxt(n, -1);
    stack<int> s;
    for (int i = 0; i < n; ++i) {
      m[nums2[i]] = i;
      while (!s.empty() && nums2[s.top()] < nums2[i]) {
        nxt[s.top()] = nums2[i];
        s.pop();
      }
      s.push(i);
    }
    vector<int> res;
    res.reserve(nums1.size());
    for (const int a : nums1) res.emplace_back(nxt[m[a]]);
    return res;
  }
};

上面那种直接修改出来的解法显然不够简洁。简单修改就可以去掉多余的 $nxt$ 数组。

class Solution {
 public:
  vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
    const int n = nums2.size();
    unordered_map<int, int> m;
    stack<int> s;
    for (int i = 0; i < n; ++i) {
      while (!s.empty() && s.top() < nums2[i]) {
        m[s.top()] = nums2[i];
        s.pop();
      }
      s.push(nums2[i]);
    }
    vector<int> res;
    res.reserve(nums1.size());
    for (auto a : nums1)
      if (m.find(a) != m.end())
        res.emplace_back(m[a]);
      else
        res.emplace_back(-1);
    return res;
  }
};

#直达链接

496. Next Greater Element I