97 lines
3 KiB
Markdown
97 lines
3 KiB
Markdown
# Leetcode Next-Greater-Element-I
|
|
|
|
#### 2022-07-27 10:55
|
|
|
|
> ##### Data structures:
|
|
> #DS #stack #hash_table
|
|
> ##### Difficulty:
|
|
> #coding_problem #difficulty-easy
|
|
> ##### Additional tags:
|
|
> #leetcode
|
|
> ##### Revisions:
|
|
> N/A
|
|
|
|
##### Related topics:
|
|
##### Links:
|
|
- [Link to problem](https://leetcode.com/problems/next-greater-element-i/)
|
|
___
|
|
### Problem
|
|
|
|
The **next greater element** of some element `x` in an array is the **first greater** element that is **to the right** of `x` in the same array.
|
|
|
|
You are given two **distinct 0-indexed** integer arrays `nums1` and `nums2`, where `nums1` is a subset of `nums2`.
|
|
|
|
For each `0 <= i < nums1.length`, find the index `j` such that `nums1[i] == nums2[j]` and determine the **next greater element** of `nums2[j]` in `nums2`. If there is no next greater element, then the answer for this query is `-1`.
|
|
|
|
Return _an array_ `ans` _of length_ `nums1.length` _such that_ `ans[i]` _is the **next greater element** as described above._
|
|
|
|
#### Examples
|
|
|
|
**Example 1:**
|
|
|
|
**Input:** nums1 = [4,1,2], nums2 = [1,3,4,2]
|
|
**Output:** [-1,3,-1]
|
|
**Explanation:** The next greater element for each value of nums1 is as follows:
|
|
- 4 is underlined in nums2 = [1,3,4,2]. There is no next greater element, so the answer is -1.
|
|
- 1 is underlined in nums2 = [1,3,4,2]. The next greater element is 3.
|
|
- 2 is underlined in nums2 = [1,3,4,2]. There is no next greater element, so the answer is -1.
|
|
|
|
**Example 2:**
|
|
|
|
**Input:** nums1 = [2,4], nums2 = [1,2,3,4]
|
|
**Output:** [3,-1]
|
|
**Explanation:** The next greater element for each value of nums1 is as follows:
|
|
- 2 is underlined in nums2 = [1,2,3,4]. The next greater element is 3.
|
|
- 4 is underlined in nums2 = [1,2,3,4]. There is no next greater element, so the answer is -1.
|
|
|
|
#### Constraints
|
|
|
|
### Thoughts
|
|
|
|
> [!summary]
|
|
> This is a problem using the traits of #stack.
|
|
|
|
This problem can be divided into two sub-problems:
|
|
|
|
- given a subset number, return its location in the parent set -> hash table
|
|
- given a array, return the next greater element in the array after it -> stack
|
|
|
|
#### How is the stack used?
|
|
|
|
Stack is FILO, which means, when iterating from the last element, if you push a number greater into it, it will be used last, ideal for finding the **next** biggest one.
|
|
|
|
### Solution
|
|
|
|
```cpp
|
|
class Solution {
|
|
public:
|
|
vector<int> nextGreaterElement(vector<int> &nums1, vector<int> &nums2) {
|
|
// Hash table to link the subsets.
|
|
unordered_map<int, int> greater;
|
|
stack<int> st;
|
|
|
|
for (int i = nums2.size() - 1; i >= 0; i--) {
|
|
while (!st.empty() && st.top() < nums2[i]) {
|
|
st.pop();
|
|
}
|
|
if (!st.empty()) {
|
|
greater[nums2[i]] = st.top();
|
|
}
|
|
|
|
st.push(nums2[i]);
|
|
}
|
|
|
|
// double pointers can't be used, because nums doesn't have a order.
|
|
vector<int> ans(nums1.size());
|
|
for (int i = 0, size1 = nums1.size(); i < size1; i++) {
|
|
if (greater.find(nums1[i]) != greater.end()) {
|
|
ans[i] = greater[nums1[i]];
|
|
} else {
|
|
ans[i] = -1;
|
|
}
|
|
}
|
|
|
|
return ans;
|
|
}
|
|
};
|
|
``` |