Next Greater Element I
Question
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.
Example 1:
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.
Example 2:
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.
Note:
- All elements in
nums1
andnums2
are unique. - The length of both
nums1
andnums2
would not exceed 1000.
Tags
- Array
- Stack
Thought
Basic idea is to use the hash map to store the next greater number when looping through the array. But the implementation approach may vary:
- With stack
- Without stack
The implementation detail is below.
Code
without stack
class Solution(object):
def nextGreaterElement(self, findNums, nums):
"""
:type findNums: List[int]
:type nums: List[int]
:rtype: List[int]
"""
nextDict = dict()
queue = []
for num in nums:
nextDict[num] = -1
newQueue = []
for current in queue:
if num > current:
nextDict[current] = num
else:
newQueue.append(current)
queue = newQueue + [num]
ans = []
for num in findNums:
ans.append(nextDict[num])
return ans
with stack Reference: http://bookshadow.com/weblog/2017/02/05/leetcode-next-greater-element-i/
class Solution(object):
def nextGreaterElement(self, findNums, nums):
"""
:type findNums: List[int]
:type nums: List[int]
:rtype: List[int]
"""
dmap = {}
stack = []
for n in nums:
while stack and stack[-1] < n:
dmap[stack.pop()] = n
stack.append(n)
return [dmap.get(n, -1) for n in findNums]