博客
关于我
【力扣算法16】之 18. 四数之和 python
阅读量:584 次
发布时间:2019-03-10

本文共 2020 字,大约阅读时间需要 6 分钟。

为了解决这个问题,我们需要找到一个数组中满足特定条件的四元组。四元组中的四个数必须来自不同的位置,并且它们的和等于给定的目标值。同时,这些四元组不能重复。

方法思路

为了高效地解决这个问题,我们可以使用双指针法。具体步骤如下:

  • 排序数组:对数组进行排序,这样可以方便后续的去重和判断。
  • 去重处理:在遍历时,避免重复的元素组合。例如,在生成四元组时,使用集合存储这些四元组的值,避免重复。
  • 双指针搜索:对于每一对可能的第一个和第二个元素的位置,使用双指针来寻找剩下的两个元素,使得四个数的和等于目标值。
  • 具体实现步骤如下:

  • 如果数组长度小于4,直接返回空列表,因为无法找到四个数的组合。
  • 对数组进行排序。
  • 初始化结果列表为空。
  • 外层循环遍历数组中的每一个可能作为第一个元素的位置a。
  • 对a进行去重处理:如果当前元素与前一个元素相同,跳过。
  • 内层循环遍历数组中的每一个可能作为第二个元素的位置b(b > a)。
  • 对b进行去重处理:如果当前元素与前一个元素相同,跳过。
  • 初始化左指针为b+1,右指针为数组末尾。
  • 进入双指针循环:不断移动左右指针以搜索四个数的组合。
  • 计算当前四个数的和。
  • 如果和等于目标,添加四元组到结果,并进行去重处理。
  • 根据和与目标的关系,调整指针的位置。
  • 返回结果列表。
  • 解决代码

    class Solution:
    def fourSum(self, nums, target):
    n = len(nums)
    if n < 4:
    return []
    nums.sort()
    result = set() # 使用集合存储四元组,避免重复
    for a in range(n - 3):
    if a > 0 and nums[a] == nums[a - 1]:
    continue
    for b in range(a + 1, n - 2):
    if b > a + 1 and nums[b] == nums[b - 1]:
    continue
    left = b + 1
    right = n - 1
    while left < right:
    current_sum = nums[a] + nums[b] + nums[left] + nums[right]
    if current_sum == target:
    quad = (nums[a], nums[b], nums[left], nums[right])
    if quad not in result:
    result.add(quad)
    # 去重处理,避免相邻重复元素
    while left < right and nums[left] == nums[left + 1]:
    left += 1
    while left < right and nums[right] == nums[right - 1]:
    right -= 1
    elif current_sum < target:
    left += 1
    else:
    right -= 1
    return [list(quad) for quad in result]

    代码解释

  • 排序数组:对数组进行排序,以便后续的双指针搜索。
  • 去重处理:在生成四元组时,使用集合来存储这些四元组的值,避免重复。
  • 双指针搜索:对于每一对可能的第一个和第二个元素的位置,使用双指针来寻找剩下的两个元素,使得四个数的和等于目标值。根据当前和与目标的关系,调整指针的位置,直到满足条件或结束搜索。
  • 这种方法确保了我们能够高效地找到所有满足条件的四元组,并且避免了重复的元素组合。

    转载地址:http://nsjvz.baihongyu.com/

    你可能感兴趣的文章
    nginx 反向代理 转发请求时,有时好有时没反应,产生原因及解决
    查看>>
    Nginx 反向代理+负载均衡
    查看>>
    Nginx 反向代理解决跨域问题
    查看>>
    Nginx 反向代理配置去除前缀
    查看>>
    nginx 后端获取真实ip
    查看>>
    Nginx 多端口配置和访问异常问题的排查与优化
    查看>>
    Nginx 如何代理转发传递真实 ip 地址?
    查看>>
    Nginx 学习总结(16)—— 动静分离、压缩、缓存、黑白名单、性能等内容温习
    查看>>
    Nginx 学习总结(17)—— 8 个免费开源 Nginx 管理系统,轻松管理 Nginx 站点配置
    查看>>
    Nginx 学习(一):Nginx 下载和启动
    查看>>
    nginx 常用指令配置总结
    查看>>
    Nginx 常用配置清单
    查看>>
    nginx 常用配置记录
    查看>>
    nginx 开启ssl模块 [emerg] the “ssl“ parameter requires ngx_http_ssl_module in /usr/local/nginx
    查看>>
    Nginx 我们必须知道的那些事
    查看>>
    Nginx 源码完全注释(11)ngx_spinlock
    查看>>
    Nginx 的 proxy_pass 使用简介
    查看>>
    Nginx 的 SSL 模块安装
    查看>>
    Nginx 的优化思路,并解析网站防盗链
    查看>>
    Nginx 的配置文件中的 keepalive 介绍
    查看>>