找下一个更大元素
给定两个没有重复元素的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集。找到 nums1 中每个元素在 nums2 中的下一个比其大的值。
nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位置的右边的第一个比 x 大的元素。如果不存在,对应位置输出-1。
思路一:
- 循环两个列表,在nums2中找nums1中的数字。如果没有找到在新列表中加-1
- 如果找到了,判断他是否在nums2的末尾,如果是,直接在新列表中加-1
- 如果不是,从j+1以后找,直到找到有比nums2[j]大的数字,如果没有直接在新列表中加-1,如果有在新列表中加找到的那个值。
超出时间限制!!!!
class Solution(object):
def nextGreaterElement(self, nums1, nums2):
"""
:type nums1: List[int]
:type nums2: List[int]
:rtype: List[int]
"""
nums3=[]
for i in range(len(nums1)):
for j in range(len(nums2)):
if nums1[i] == nums2[j]:
if j == len(nums2)-1:
nums3.append(-1)
else:
for k in range(j+1,len(nums2)):
while nums1[i] < nums2[k]:
nums3.append(nums2[k]
nums3.append(-1)
else:
j = j + 1
return nums3
思路二:
- 运用了栈的思想,以及dict
- 将nums2的第一个数进栈,继续遍历,比较当前的元素与栈顶相比较,如果比栈顶大,那么他们组成了一个dict{res.pop():nums2[j]},如果不是,进栈
- 遍历nums2以后,这样就得到了nums2中所对应的下一个最大元素
- 遍历nums1看dict中是否存在,如果不存在,新列表加-1,如果存在,加dict中key对应的value。
class Solution(object):
def nextGreaterElement(self, nums1, nums2):
"""
:type nums1: List[int]
:type nums2: List[int]
:rtype: List[int]
"""
res = []
dict1 ={}
nums3 = []
for i in range(len(nums2)):
while not res ==[] and nums2[i]>res[-1]:
dict1[res.pop()]= nums2[i]
res.append(nums2[i])
for k in range(len(nums1)):
if dict1.has_key(nums1[k]):
nums3.append(dict1[nums1[k]])
else:
nums3.append(-1)
return nums3