两个数组的交集
def intersection(nums1: list[int], nums2: list[int]) -> list[int]:
res = []
nums1 = set(nums1)
nums2 = set(nums2)
if len(nums1) <= len(nums2):
for i in nums1:
if i in nums2:
res.append(i)
else:
for i in nums2:
if i in nums1:
res.append(i)
return res
nums1 = [4,9,5]
nums2 = [9,4,9,8,4]
print(intersection(nums1,nums2))
最简版本:
def intersection(nums1: list[int], nums2: list[int]) -> list[int]:
return list(set(nums1) & set(nums2))
下面这种:
count1 = [0]*1001
count2 = [0]*1001
result = []
for i in range(len(nums1)):
count1[nums1[i]]+=1
for j in range(len(nums2)):
count2[nums2[j]]+=1
for k in range(1001):
if count1[k]*count2[k]>0:
result.append(k)
return result
不过这种效率肯定是最低的
两个数组的交集 II
def intersect(self, nums1: list[int], nums2: list[int]) -> list[int]:
nums1.sort()
nums2.sort()
left,right = 0,0
res = []
while left < len(nums1) and right < len(nums2):
if nums1[left] < nums2[right]:
left += 1
elif nums1[left] > nums2[right]:
right += 1
else:
res.append(nums1[left])
left += 1
right += 1
return res
感觉题解里这个解法挺不错的
快乐数
def isHappy(n: int) -> bool:
def get_sum(n):
lis = list(str(n))
Sum = 0
for i in lis:
Sum += int(i) ** 2
return Sum
res = [n]
n = get_sum(n)
while 1:
if n == 1:
return True
else:
if n in res:
return False
res.append(n)
n = get_sum(n)
精简高效版:
def isHappy(n: int) -> bool:
res = [n]
while n != 1:
n = sum(int(i) ** 2 for i in str(n))
if n in res:
return False
res.append(n)
return True
两数之和
def twoSum(nums, target):
d = {i:x for i,x in enumerate(nums)}
sort_d = sorted(d.items(),key=lambda x:x[1]) # 列表里面装数组
nums.sort()
left = 0
right = len(nums) - 1
while left <= right:
if nums[left] + nums[right] < target:
left += 1
elif nums[left] + nums[right] > target:
right -= 1
else:
return [sort_d[left][0],sort_d[right][0]]
三数之和
def threeSum(nums: list[int]) -> list[list[int]]:
res = []
nums.sort()
for i in range(len(nums)):
if nums[i] > 0:
return res
if i > 0 and nums[i] == nums[i - 1]:
continue
left = i + 1
right = len(nums) - 1
while left < right:
if nums[left] + nums[right] < -nums[i]:
left += 1
elif nums[left] + nums[right] > -nums[i]:
right -= 1
else:
res.append([nums[left],nums[right],nums[i]])
while left < right and nums[left] == nums[left + 1]:
left += 1
while left < right and nums[right] == nums[right - 1]:
right -= 1
left += 1
right -= 1
return res
nums = [-1,0,1,2,-1,-4]
print(threeSum(nums))
四数之和
def fourSum(nums: list[int], target: int) -> list[list[int]]:
length = len(nums)
if length < 4:
return []
nums.sort()
res = []
for i in range(length - 3):
if i > 0 and nums[i] == nums[i - 1]:
continue
if nums[i] + nums[i + 1] + nums[i + 2] + nums[i + 3] > target:
break
if nums[i] + nums[length - 1] + nums[length - 2] + nums[length - 3] < target:
continue
temp = target - nums[i]
for j in range(i + 1, length - 2):
if j > i + 1 and nums[j] == nums[j - 1]:
continue
left = j + 1
right = length - 1
while left < right:
Sum = nums[j] + nums[left] + nums[right]
if Sum < temp:
left += 1
elif Sum > temp:
right -= 1
else:
res.append([nums[i], nums[j], nums[left], nums[right]])
while left < right and nums[left] == nums[left + 1]:
left += 1
while left < right and nums[right] == nums[right - 1]:
right -= 1
left += 1
right -= 1
return res
两数,三数,四数之和都挺类似的,就是限制条件多加点就行
四数相加 Ⅱ
def fourSumCount(nums1: list[int], nums2: list[int], nums3: list[int], nums4: list[int]) -> int:
hashmap = dict()
for n1 in nums1:
for n2 in nums2:
if n1 + n2 in hashmap:
hashmap[n1 + n2] += 1
else:
hashmap[n1 + n2] = 1
count = 0
for n3 in nums3:
for n4 in nums4:
key = - n3 - n4
if key in hashmap:
count += hashmap[key]
return count
nums1 = [1,2]
nums2 = [-2,-1]
nums3 = [-1,2]
nums4 = [0,2]
print(fourSumCount(nums1,nums2,nums3,nums4))
或者:
def fourSumCount(nums1: list[int], nums2: list[int], nums3: list[int], nums4: list[int]) -> int:
rec, cnt = defaultdict(lambda :0),0
for i in nums1:
for j in nums2:
rec[i + j] += 1
for i in nums3:
for j in nums4:
cnt += rec.get(-(i + j),0) # 从字典 rec 中获取键为 -(i + j) 的值,如果该键不存在,则返回默认值 0
defaultdict
,get((i + j),0)