法1:单调栈
Python
class Solution:
def nextGreaterElement(self, nums1: List[int], nums2: List[int]) -> List[int]:
val_idx_dict = {x: i for i, x in enumerate(nums1)}
res = [-1] * len(nums1)
stack = []
for x in reversed(nums2):
while stack and stack[-1] <= x:
stack.pop()
if stack and x in val_idx_dict:
res[val_idx_dict[x]] = stack[-1]
stack.append(x)
return res
Java
class Solution {
public int[] nextGreaterElement(int[] nums1, int[] nums2) {
Map<Integer, Integer> map = new HashMap<>();
Stack<Integer> stack = new Stack<>();
for (int i = nums2.length - 1; i >= 0; --i) {
while (!stack.isEmpty() && nums2[i] >= stack.peek()) {
stack.pop();
}
map.put(nums2[i], stack.isEmpty() ? -1 : stack.peek());
stack.push(nums2[i]);
}
int[] res = new int[nums1.length];
for (int i = 0; i < nums1.length; ++i) {
res[i] = map.get(nums1[i]);
}
return res;
}
}
法2:迭代
最简单的方法,必须掌握!!!O(MN)
class Solution {
public int[] nextGreaterElement(int[] nums1, int[] nums2) {
int[] res = new int[nums1.length];
Arrays.fill(res, -1);
for (int i = 0; i < nums1.length; ++i) {
int val = nums1[i];
int nextBig = -1;
for (int k = nums2.length - 1; k >= 0; --k) {
if (nums2[k] == val) {
break;
}
if (nums2[k] > val) {
res[i] = nums2[k];
}
}
}
return res;
}
}