1 四指针
与leetcode 15. 三数之和(中等)
思想相同,区别在于再套一层循环,固定两个指针,移动另外两个指针。
class Solution:
def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
nums.sort()
res = []
for i in range(len(nums)-3):
if i > 0 and nums[i] == nums[i-1]:
continue
for j in range(i+1, len(nums)-2): # 再套一层循环
if j > i+1 and nums[j] == nums[j-1]:
continue
k, s = j+1, len(nums)-1
while k < s:
total = nums[i] + nums[j] + nums[k] + nums[s]
if total < target:
k += 1
elif total > target:
s -= 1
else:
res.append([nums[i], nums[j], nums[k], nums[s]])
while k < s and nums[k] == nums[k+1]:
k += 1
while k < s and nums[s] == nums[s-1]:
s -= 1
k += 1
s -= 1
return res
时间复杂度为 O ( n 3 ) O(n^3) O(n3)
哈希表
class Solution:
def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
res = set()
dictionary = {}
if len(nums) < 4:
return []
nums.sort()
# 将其中两个数存储到哈希表中,剩余两个数通过双指针求解
for i in range(len(nums)-1): # i和j为四个数中的后两个数
if i < len(nums)-5 and nums[i] == nums[i+5]: # 针对大量重复情况去一下重,避免超时
i += 1
continue
for j in range(i+1, len(nums)):
if nums[i] + nums[j] in dictionary:
dictionary[nums[i] + nums[j]].append((i, j))
else:
dictionary[nums[i] + nums[j]] = [(i, j)]
for k in range(len(nums)-3): # k和s为前两个数
for s in range(k+1, len(nums)-2):
temp = target - nums[k] - nums[s]
if temp in dictionary:
for m in dictionary[temp]:
if m[0] > s: # 保证s < i
res.add((nums[k], nums[s], nums[m[0]], nums[m[1]]))
return [list(n) for n in res]
时间复杂度为O(n^2), 第三层for循环只是为了打印。