public class Solution {
public int[] nextGreaterElement(int[] findNums, int[] nums) {
if (nums == null || findNums == null) {
return null;
}
// No duplicates in both of the arrays, put num2 into a hashp map
// Key is the number and value is index in num2
HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
for (int i=0; i<nums.length; i++) {
map.put(nums[i], i);
}
// For every number in num1, get the next greater number
int[] res = new int[findNums.length];
for (int i=0; i<findNums.length; i++) {
int index = map.get(findNums[i]);
res[i] = getGreaterNum(findNums[i], index, nums);
}
return res;
}
public static int getGreaterNum(int target, int index, int[] nums) {
for (int i=index+1; i<nums.length; i++) {
if (nums[i] > target)
return nums[i];
}
return -1;
}
}
O(m+n)
/**
* Stack + HashMap solution. O(m+n)
* Using stack to find all valid paris that is [num1, num2] which num2 is the first number greater than num1 in nums array.
* Save those pair into a hashmap.
* Output pairs which are in findNums.
*/
public class Solution {
public int[] nextGreaterElement(int[] findNums, int[] nums) {
if (findNums == null || nums == null || findNums.length == 0 || nums.length == 0) {
return new int[0];
}
Stack<Integer> stack = new Stack<>();
HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
for (int i=0; i<nums.length; i++) {
while (!stack.isEmpty() && nums[i]>stack.peek()) {
map.put(stack.pop(), nums[i]);
}
stack.push(nums[i]);
}
// Numbers which have no next greater number
while (!stack.isEmpty()) {
map.put(stack.pop(), -1);
}
// Output what we want
int[] res = new int[findNums.length];
for (int i=0; i<findNums.length; i++) {
if (map.containsKey(findNums[i]))
res[i] = map.get(findNums[i]);
}
return res;
}
}