两数之和
给定一个整数数组
nums
和一个整数目标值target
,请你在该数组中找出 和为目标值target
的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
用暴力解法,两个for循环,时间复杂度为o(n²)
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
for i in range(len(nums)):
for j in range(i+1, len(nums)):
if nums[i] + nums[j] == target:
return [i,j]
我们尝试不回头,只循环一次,那就需要将已循环的进行保存,再匹配。由于我们不仅要知道保存数值,还要返回下标,所以选择字典。
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
records = dict()
for index, value in enumerate(nums):
if target - value in records: # 遍历当前元素,并在map中寻找是否有匹配的key
return [records[target- value], index]
records[value] = index # 如果没找到匹配对,就把访问过的元素和下标加入到map中
return []
四数相加II
给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] + B[j] + C[k] + D[l] = 0。
如果采用暴力解法,时间复杂度为n^4。
用字典,key:保存A+B的值,value:A+B出现的次数;再循环C,D→如果 -(C+D)在字典中,则记录value的值。(value表示有x组A、B,他们分别可以跟C、D组成一组)
class Solution:
def fourSumCount(self, nums1: List[int], nums2: List[int], nums3: List[int], nums4: List[int]) -> int:
records = dict()
for a in nums1:
for b in nums2:
if a+b in records:
records[a+b] += 1
else:
records[a+b] = 1
counts = 0
for c in nums3:
for d in nums4:
if -(c+d) in records:
counts += records[-(c+d)]
return counts