LeetCode 18. 4Sum(第九周)

本文介绍了一道经典的算法题目——寻找数组中是否存在四个数的和等于目标值。通过详细解析并提供Python代码实现,展示了如何有效地解决该问题,避免重复解的同时保持较高的查找效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

Given an array nums of n integers and an integer target, are there elements abc, and d in nums such that a + b + c + d = target? Find all unique quadruplets in the array which gives the sum of target.

Note:

The solution set must not contain duplicate quadruplets.

Example:

Given array nums = [1, 0, -1, 0, -2, 2], and target = 0.

A solution set is:
[
  [-1,  0, 0, 1],
  [-2, -1, 1, 2],
  [-2,  0, 0, 2]
]

思路 & 代码:

在列表中不重复地找出和等于目标数的四个数。

将列表用sort()函数由小到大排好序。设置三个变量h, i, j, k,做两层循环,h from 0 to n - 3,i from 0 to n - 2,初始值:j = i + 1,k = n - 1,nums[h]、nums[i]、nums[j]、nums[k]四个数的和sum与target进行比较:若sum == target,创建一个元素为这四个数的列表,并将这个列表添加到存放所有结果的列表里,j += 1,k -= 1,即j、k往中间都挪一步,并检查是否 j < k 以及nums[j]、nums[k]是否与前一个值有异,避免重复;在 j < k 的前提下,sum > target,k -= 1,并检查是否 j < k 以及nums[k]是否与前一个值有异,避免重复,反之,j += 1,并检查是否 j < k 以及nums[j]是否与前一个值有异,避免重复;直至遍历结束。

另. 遍历时除第一次外每次检查 nums[h]、nums[i] 是否与列表中前一个数相同,避免重复工作。

class Solution:
def fourSum(self, nums, target):
nums.sort()
#print(nums)
res = []
n = len(nums)
for h in range(n - 3):
#print(h)
if h > 0 and nums[h] == nums[h - 1]:
continue
for i in range(h + 1, n - 2):
if i > h + 1 and nums[i] == nums[i - 1]:
continue
j = i + 1
k = n - 1
while j < k:
#print(i, j, k)
sum = nums[h] + nums[i] + nums[j] + nums[k]
if sum == target:
tmp = [nums[h], nums[i], nums[j], nums[k]]
res.append(tmp)
j += 1
k -= 1
while j < k and nums[j] == nums[j - 1]: j += 1
while j < k and nums[k] == nums[k + 1]: k -= 1
elif sum > target:
k -= 1
while j < k and nums[k] == nums[k + 1]: k -= 1
else: 
j += 1
while j < k and nums[j] == nums[j - 1]: j += 1
return res
 
sol = Solution()
nums = [1, 0, -1, 0, -2, 2]
target = 0
print(sol.fourSum(nums, target))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值