1.题目描述:
给定两个 没有重复元素 的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集。找到 nums1 中每个元素在 nums2 中的下一个比其大的值。
nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位置的右边的第一个比 x 大的元素。如果不存在,对应位置输出 -1 。
示例 1:
输入: nums1 = [4,1,2], nums2 = [1,3,4,2].
输出: [-1,3,-1]
解释:
对于num1中的数字4,你无法在第二个数组中找到下一个更大的数字,因此输出 -1。
对于num1中的数字1,第二个数组中数字1右边的下一个较大数字是 3。
对于num1中的数字2,第二个数组中没有下一个更大的数字,因此输出 -1。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/next-greater-element-i
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2.题目解析:
这道题可能不是那么很好理解。简单翻译一下,给定两个数组A,B,A是B的子集,在A中从左往右取一个值,从B中找到该值对应的位置,如果在B中该值右侧能找到比该值更大的值,则输出第一个更大的值,如果找不到返回-1,最终将值和-1保存到一个列表中。运用示例一,nums1中的4,在nums2中的位置是2,右侧没有更大的值返回-1;nums1中的1,在nums2中的位置是0,在右侧第一个最大的值是3,那么就返回3。
3.程序实现:(python3)
将nums1的值从左往遍历,在nums2中找到相同的值并返回在nums2中的下标,从该下标+1的位置开始往右遍历,找到大的值则将第一个大的值存储,找不到则返回-1。
class Solution:
def nextGreaterElement(self, nums1: List[int], nums2: List[int]) -> List[int]:
a=[] # 定义一个空列表用保存值
for i in range(len(nums1)): # 将nums1从左至右遍历
j=nums2.index(nums1[i]) # 找到nums1中的值在nums2中的下标
for t in range(j+1,len(nums2)): # 在nums2中从值nums[i]右侧开始遍历
if nums2[t]-nums1[i]>0: # 如果找到比nums1[i]大的值
a.append(nums2[t]) # 将大的值nums[j]存到a[]中
break # 只保存第一个大的值,找到后跳出当前循环
else: # 没有找到
a.append(-1) # 将-1添加到a[]中
return a # 返回列表a
执行用时:96 ms, 在所有 Python3 提交中击败了30.38%的用户
内存消耗:13.4 MB, 在所有 Python3 提交中击败了61.33%的用户
4.for…else…的用法:
for…else用法目前只在python中见过,以前是在看书的时候见过,这次做题凭着自己的理解试着用了一下。
for…else…就相当于if…else…。对于带有else子句的循环结构,如果循环因为条件表达式不成立或者序列遍历结束而自然结束时执行else结构中的语句,如果循环是因为执行了break语句而导致循环提前结束则不会执行else中的语句。所以不止有for…else…还有while…else…。
具体用法可以参考题程序。
年薪百万小分队(人工智能方向)