📅  最后修改于: 2023-12-03 14:55:47.352000             🧑  作者: Mango
给定两个整数数组 nums1
和 nums2
,请编写一个函数来检查其中每个数是否能由 nums2
中任意两个数的和表示。如果可以找到这样的两个数,返回 True
;否则返回 False
。
最容易想到的方法是对每个数在 nums2
中进行暴力枚举,寻找是否存在两个数的和等于该数。这种方法时间复杂度为 $O(n^3)$,不太适合数据量较大的情况。
def check_array_sum(nums1, nums2):
for num in nums1:
found = False
for i in range(len(nums2)):
for j in range(i+1, len(nums2)):
if nums2[i] + nums2[j] == num:
found = True
break
if found:
break
if not found:
return False
return True
可以通过哈希表对第二个数组 nums2
进行加速。首先用哈希表保存 nums2
中每个数的下标,然后对于 nums1
中的每个数,我们在哈希表中查找是否存在能与之相加等于该数的数。时间复杂度降低到了 $O(n^2)$。
def check_array_sum(nums1, nums2):
dic = {}
for i, num in enumerate(nums2):
dic[num] = i
for num in nums1:
found = False
for i, n in enumerate(nums2):
if num - n in dic and i != dic[num-n]:
found = True
break
if not found:
return False
return True
由于函数要检查数组 nums1
中每个数是否能由 nums2
中任意两个数的和表示,我们可以先对数组 nums2
进行排序,然后使用双指针方法,每次选择最左边和最右边的两个数,如果它们的和小于目标数,就将左指针右移,如果和大于目标数,就将右指针左移。时间复杂度为 $O(n\log n + n^2)$。
def check_array_sum(nums1, nums2):
nums2.sort()
for num in nums1:
found = False
left, right = 0, len(nums2)-1
while left < right:
s = nums2[left] + nums2[right]
if s == num:
found = True
break
elif s < num:
left += 1
else:
right -= 1
if not found:
return False
return True
以上三种解法中,第三种最高效,建议首选。