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.
解法1:
暴力
class Solution(object):
def nextGreaterElement(self, findNums, nums):
"""
:type findNums: List[int]
:type nums: List[int]
:rtype: List[int]
"""
m = {n:i for i,n in enumerate(nums)}
ans = []
for n in findNums:
pos = m[n]
inf = float("inf")
ng_num = inf
while pos+1<len(nums):
pos += 1
if nums[pos]>n:
ng_num = nums[pos]
break
if ng_num == inf:
ans.append(-1)
else:
ans.append(ng_num)
return ans
方法2:使用stack,非常巧妙的解决,时间复杂度O(n),学会观察是王道。
Key observation:
Suppose we have a decreasing sequence followed by a greater number
For example [5, 4, 3, 2, 1, 6]
then the greater number 6
is the next greater element for all previous numbers in the sequence
We use a stack to keep a decreasing sub-sequence, whenever we see a number x
greater than stack.peek()
we pop all elements less than x
and for all the popped ones, their next greater element is x
For example [9, 8, 7, 3, 2, 1, 6]
The stack will first contain [9, 8, 7, 3, 2, 1]
and then we see 6
which is greater than 1
so we pop 1 2 3
whose next greater element should be 6
class Solution(object):
def nextGreaterElement(self, findNums, nums):
"""
:type findNums: List[int]
:type nums: List[int]
:rtype: List[int]
"""
# [1, 3, 4, 2, 2.5, 6, 5, 3.5, 1.5, 4.5, 0, 7]
# 1=>3
# 3=>4
# 4=>6
# 2=>2.5
# 2.5=>6
# 6=>7
# 5=>7
# 3.5=>4.5
# 1.5=>4.5
# 4.5=>7
# 0=>7
# for each num in nums, create lookup table for NG numer
# use lookup table to find each num's NG in findNums
ng_map = {}
stack = []
for n in nums:
while stack and stack[-1] < n:
ng_map[stack.pop()] = n
stack.append(n)
return [ng_map[n] if n in ng_map else -1 for n in findNums]
标签:Greater,nums1,stack,number,Element,array,next,496,greater From: https://blog.51cto.com/u_11908275/6381132