1. 程式人生 > 其它 >Leetcode-496 下一個更大元素

Leetcode-496 下一個更大元素

Leetcode-496 下一個更大元素

  1. 題意:

    給定兩個陣列,陣列1為陣列2的子集,遍歷陣列1,求出陣列1中每個元素在陣列2中該元素右邊的第一個比該數大的元素,若不存在,則返回-1.

    eg: nums1=[4,2,3,1] nums2=[3,4,5,1,2]

    遍歷陣列1,對於元素4,更大的元素為5,對於元素2,因陣列2右邊沒有元素了,返回-1,對於元素3,返回元素4,對於元素1,返回元素2.

  2. 解題思路:

    1. 暴力求解

      遍歷每個元素,求出在nums2中的位置,再遍歷其右邊的元素得到較大值。此方法會超時。

    2. 使用stack和map求解

      先忽略陣列1,遍歷陣列2,使用棧將當前元素入棧,判斷下一個元素是否大於棧頂元素,若大於,則

      判斷棧不空且下一個元素大於棧頂元素,則loop:{

      ​ 將map元素(棧頂元素,下一個元素)加入到map中

      }

      map中key值為元素值,value值為下一個更大元素,結果便可通過遍歷陣列1,取得map中相對應的value。

  1. Code
#include <cmath>
#include <iostream>
#include <map>
#include <stack>
#include <vector>
using namespace std;
class Solution {
 public:
  vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
    vector<int> res;
    if (nums1.size() == 0 || nums2.size() == 0) {
      return res;
    }
    stack<int> s;
    map<int, int> m;
    for (int i = 0; i < nums2.size() - 1; i++) {
      s.push(nums2[i]);
      while (!s.empty() && nums2[i + 1] > s.top()) {
        m.insert(pair<int, int>(s.top(), nums2[i + 1]));
        s.pop();
      }
    }
    while (!s.empty()) {
      m.insert(pair<int, int>(s.top(), -1));
      s.pop();
    }
    m.insert(pair<int, int>(nums2[nums2.size() - 1], -1));
    for (int i = 0; i < nums1.size(); i++) {
      res.push_back(m[nums1[i]]);
    }
    return res;
  }
};
int main() {
  vector<int> s1 = {1, 2};
  vector<int> s2 = {3, 1, 2};
  Solution s;
  s.nextGreaterElement(s1, s2);
  return 0;
}