class Solution {
public int[] nextGreaterElement(int[] nums1, int[] nums2) {
int n = nums2.length;
int[] highRight = new int[n];
Deque<Integer> stk = new LinkedList<>();
Map<Integer, Integer> map = new HashMap<>();
for (int i = n - 1; i >= 0; i--) {
while (!stk.isEmpty() && nums2[i] >= nums2[stk.peek()]) stk.pop();
highRight[i] = stk.isEmpty() ? n : stk.peek();
stk.push(i);
map.put(nums2[i], i);
}
int m = nums1.length;
int[] res = new int[m];
Arrays.fill(res, -1);
for (int i = 0; i < m; i++) {
if (map.containsKey(nums1[i])) {
int t = map.get(nums1[i]);
if (highRight[t] != n) res[i] = nums2[highRight[t]];
}
}
return res;
}
}