做过三数之和,很容易就能做四数之和,在这里主要还是用双指针执行两数之和,另外两数用枚举的方法,复杂度O(n^3)。代码如下:
class Solution:
def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
if len(nums) < 4:
return []
def helper(num,target):#三数之和
result = []
if len(num) < 3: #如果没有3个数
return #爬
for i in range(len(num)-2): #第二次枚举
if i > 0 and num[i] == num[i-1]:#优化,防止枚举重复
continue
left = i + 1 #双指针开始动了
right = len(num) -1
while left < right:
sum_3 = num[i] + num[left] + num[right]
if sum_3 == target:
result.append([num[i],num[left],num[right]])#将此时的数字放入三数之和的结果
left += 1
right -= 1
elif sum_3 > target:
right -= 1
elif sum_3 < target:
left += 1
return result
nums.sort()
print(nums)
res = []
for i in range(len(nums)-3):#第一次枚举
if i > 0 and nums[i] == nums[i-1]:#防止枚举重复
continue
new_target = target - nums[i]#剩下三个数此时的和是new_target
#回到三数之和
session = nums[i+1:]
temp = helper(session,new_target)
print([i,temp])
if temp != []: #有结果返回
for j in temp:
o = j+[nums[i]] #将此时返回的结果与nums[i]相加
if o not in res:#防止重复呢
res.append(j+[nums[i]])
return res
当然,双指针很简单,看了别人的代码后,发现哈希表的复杂度可以到O(n^2)。
原因为 枚举两个数、哈希另外两个数的和的复杂度都是O(n^2),所以总体复杂度为:
O(n^2),代价则是牺牲了空间。
代码如下:
class Solution:
def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
ans = []
nums.sort()
len_nums = len(nums)
# hash后两个数的和,并保存索引
table = {
}
for j in range(len_nums-1, 2, -1):
if j < len_nums-1 and nums[j] == nums[j+1]:
continue
if 4 * nums[j] < target:
break
if nums[j] + 3*nums[0] > target:
continue
for i in range(j-1, 1, -1):
if i < j-1 and nums[i] == nums[i+1]:
continue
if nums[j] + 3*nums[i] < target:
break
if nums[j] + nums[i] + 2*nums[0] > target:
continue
table.setdefault(nums[i] + nums[j], []).append((i, j))
# 枚举前两个数
for i in range(len_nums-3):
if i > 0 and nums[i] == nums[i-1]:
continue
if nums[i] * 4 > target:
break
if nums[i] + 3 * nums[-1] < target:
continue
for j in range(i + 1, len_nums-2):
if j > i + 1 and nums[j] == nums[j-1]:
continue
if nums[i] + 3*nums[j] > target:
break
if nums[i] + nums[j] + 2*nums[-1] < target:
continue
for index, jndex in table.get(target - nums[i] - nums[j], []):
if j < index:
ans.append([nums[i], nums[j], nums[index], nums[jndex]])
return ans
作者:loyx
链接:https://leetcode-cn.com/problems/4sum/solution/ha-xi-biao-de-on2he-on3fang-fa-by-loyx/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
又是扩展思路的一天呢