重複する要素のない2つの配列nums1とnums2を指定します。ここで、nums1はnums2のサブセットです。nums2のnums1の各要素の次に大きい値を見つけます。
nums1の数値xの次に大きい要素は、nums2のxより大きい位置に対応するxの右側の最初の要素を指します。存在しない場合、対応する位置は-1を出力します。
例1:
入力:nums1 = [4,1,2]、nums2 = [1,3,4,2]。
出力:[ -1,3 、-1]
説明:
num1の数値4については、次に大きい数が配列にあるため、-1が出力されます。
num1の数値1の場合、2番目の配列の数値1の右側にある次に大きい数値は3です。
num1の数値2の場合、2番目の配列には次に大きい数値がないため、-1が出力されます。
例2:
入力:nums1 = [2,4]、nums2 = [1,2,3,4]。
出力:[3、-1]
説明:
num1の数値2の場合、2番目の配列で次に大きい数値はい3。
num1の数値4の場合、2番目の配列には次に大きい数値がないため、-1が出力されます。
注:
nums1とnums2のすべての要素は一意です。
nums1およびnums2の配列サイズは1000を超えません。
ソース:LeetCode(LeetCode)
リンク:https ://leetcode-cn.com/problems/next-greater-element-i
著作権はDeduction Networkに属しています。商用転載の正式な許可書に連絡し、非商用転載の出典を明記してください。
アイデア1:ロジックに直接従います。最初にnum2に対応する数値があるかどうかを確認し、ある場合はそれ以降の値より大きい値を見つけます。それ以外の場合は-1です。
class Solution:
def nextGreaterElement(self, nums1: List[int], nums2: List[int]) -> List[int]:
ans = []
length = len(nums2)
for n1 in nums1:
if n1 not in nums2:
ans.append(-1)
else:
t = nums2.index(n1)
f = 0
for i in range(t + 1, length):
if nums2[i] > n1:
ans.append(nums2[i])
f = 1
break
if f == 0:
ans.append(-1)
return ans
アイデア2:
class Solution:
def nextGreaterElement(self, nums1: List[int], nums2: List[int]) -> List[int]:
ans = []
stack = []
dict1 = {}
for n in nums2:
if stack !=[] and n > stack[-1]:
while stack != [] and n > stack[-1]:
dict1[stack[-1]] = n
stack.pop()
stack.append(n)
for n in nums1:
if n in dict1:
ans.append(dict1[n])
else:
ans.append(-1)
return ans