Leetcode-496 下一個更大元素
阿新 • • 發佈:2021-10-16
Leetcode-496 下一個更大元素
-
題意:
給定兩個陣列,陣列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.
-
解題思路:
-
暴力求解
遍歷每個元素,求出在nums2中的位置,再遍歷其右邊的元素得到較大值。此方法會超時。
-
使用stack和map求解
先忽略陣列1,遍歷陣列2,使用棧將當前元素入棧,判斷下一個元素是否大於棧頂元素,若大於,則
判斷棧不空且下一個元素大於棧頂元素,則loop:{
將map元素(棧頂元素,下一個元素)加入到map中
}
map中key值為元素值,value值為下一個更大元素,結果便可通過遍歷陣列1,取得map中相對應的value。
-
- 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; }