博客
关于我
【力扣算法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/

    你可能感兴趣的文章
    Mysql 中的日期时间字符串查询
    查看>>
    mysql 中索引的问题
    查看>>
    MySQL 中锁的面试题总结
    查看>>
    MySQL 中随机抽样:order by rand limit 的替代方案
    查看>>
    MySQL 为什么需要两阶段提交?
    查看>>
    mysql 为某个字段的值加前缀、去掉前缀
    查看>>
    mysql 主从
    查看>>
    mysql 主从 lock_mysql 主从同步权限mysql 行锁的实现
    查看>>
    mysql 主从互备份_mysql互为主从实战设置详解及自动化备份(Centos7.2)
    查看>>
    mysql 主从关系切换
    查看>>
    MYSQL 主从同步文档的大坑
    查看>>
    mysql 主键重复则覆盖_数据库主键不能重复
    查看>>
    Mysql 事务知识点与优化建议
    查看>>
    Mysql 优化 or
    查看>>
    mysql 优化器 key_mysql – 选择*和查询优化器
    查看>>
    MySQL 优化:Explain 执行计划详解
    查看>>
    Mysql 会导致锁表的语法
    查看>>
    mysql 使用sql文件恢复数据库
    查看>>
    mysql 修改默认字符集为utf8
    查看>>
    Mysql 共享锁
    查看>>