四数相加
注意点:是四个整数数组,相对于一个数组挑选4个数字相加是简单一些的,题目中是问有多少个元组,重点是多少个,不用将具体的4个数字列出,利用map的特点,寻找指定的元素,
代码实现如下:一定要自己敲代码
class Solution:
def fourSumCount(self, nums1: List[int], nums2: List[int], nums3: List[int], nums4: List[int]) -> int:
hashmap=dict()
# 将复杂问题降低维度
for i in nums1:
for j in nums2:
if i + j in hashmap:
hashmap[i+ j] += 1
else:
hashmap[i+ j] = 1
count = 0
for k in nums3:
for m in nums4:
if -(k+m) in hashmap:
count = count + hashmap[-(k + m)]
return count
三数之和
注意点:
- 不要忽略排序,排序是指针移动方向的前提,如果是排好序的话也可以考虑双指针的用法
- 去重的简单思路是筛选出来符合条件的三元组,然后再根据条件去重,,在代码实现的过程中进行去重条件控制比较细节,容易写错,有的写对了,不同的数据输入会产生错误的答案;
代码实现
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
# 利用双指针,先排序,
nums.sort()
# List 只是表示是一个列表
result = []
if nums[0] > 0:
return result
# 给第一个目标值去重
for i in range(len(nums) - 2):
if i > 0 and nums[i] == nums[i - 1]:
# 不用再循环一遍了
continue
l = i + 1
r = len(nums) - 1
while l < r:
if nums[i] + nums[l] + nums[r] > 0:
r -= 1
elif nums[i] + nums[l] + nums[r] < 0:
l += 1
else:
result.append([nums[i], nums[l], nums[r]])
# 跳过相同的元素以避免重复
while r > l and nums[r] == nums[r - 1]:
r -= 1
while r > l and nums[l] == nums[l + 1]:
l += 1
# 因为不存在相同的元素,且是排好序的,所以两遍都要向内靠近
r -= 1
l += 1
return result