You are given two arrays (without duplicates) nums1
and nums2
where nums1
’s elements are subset of nums2
. Find all the next greater numbers for nums1
's elements in the corresponding places of nums2
.
The Next Greater Number of a number x in nums1
is the first greater number to its right in nums2
. If it does not exist, output -1 for this number.
Input: nums1 = [4,1,2], nums2 = [1,3,4,2].
Output: [-1,3,-1]
Explanation:
For number 4 in the first array, you cannot find the next greater number for it in the second array, so output -1.
For number 1 in the first array, the next greater number for it in the second array is 3.
For number 2 in the first array, there is no next greater number for it in the second array, so output -1.
Input: nums1 = [2,4], nums2 = [1,2,3,4].
Output: [3,-1]
Explanation:
For number 2 in the first array, the next greater number for it in the second array is 3.
For number 4 in the first array, there is no next greater number for it in the second array, so output -1.
- All elements in
nums1
andnums2
are unique. - The length of both
nums1
andnums2
would not exceed 1000.
- mine
-
Java
Runtime: 3 ms, faster than 83.95%, Memory Usage: 39.6 MB, less than 7.41% of Java online submissions
// M = nums1.length // N = nums2.length //O(M + N)time O(N)space public int[] nextGreaterElement(int[] nums1, int[] nums2) { LinkedList<Integer> list = new LinkedList<>(); Map<Integer,Integer> map = new HashMap<>(); for(int i = 0; i < nums2.length; i++){ while(list.size() > 0 && nums2[i] > list.getLast()){ map.put(list.removeLast(),nums2[i]); } list.add(nums2[i]); } for(int i = 0; i < nums1.length; i++){ nums1[i] = map.getOrDefault(nums1[i],-1); } return nums1; }
-
-
the most votes
Runtime: 3 ms, faster than 83.95%, Memory Usage: 39.2 MB, less than 7.41% of Java online submissions
// M = nums1.length // N = nums2.length //O(M + N)time O(N)space public int[] nextGreaterElement(int[] findNums, int[] nums) { Map<Integer, Integer> map = new HashMap<>(); // map from x to next greater element of x Stack<Integer> stack = new Stack<>(); for (int num : nums) { while (!stack.isEmpty() && stack.peek() < num) map.put(stack.pop(), num); stack.push(num); } for (int i = 0; i < findNums.length; i++) findNums[i] = map.getOrDefault(findNums[i], -1); return findNums; }